新聞中心
linux系統(tǒng)的開(kāi)發(fā)者和系統(tǒng)管理者需要知道如何在線程之間正確地交換數(shù)據(jù),因此Linux系統(tǒng)提供了許多不同的線程間通信機(jī)制來(lái)實(shí)現(xiàn)這一目的。本文就Linux環(huán)境中的一些線程間通信機(jī)制進(jìn)行一番探討。

Linux線程間通信機(jī)制主要包括信號(hào),全局變量,文件映射,套接字,消息隊(duì)列等。
首先是信號(hào),Linux系統(tǒng)可以將信號(hào)傳送給人,互斥和同步問(wèn)題由接收者決定,接收者可以采取相應(yīng)措施進(jìn)行處理。信號(hào)是最輕量級(jí)的,該機(jī)制適合處理簡(jiǎn)單的通信,例如:
// 向子線程發(fā)送SIGUSR1信號(hào)
pthread_t tid;
// … 創(chuàng)建子線程
kill(tid, SIGUSR1);
全局變量是Linux中一種經(jīng)典的線程間通信方式,多個(gè)線程可以訪問(wèn)同一個(gè)全局變量,但是它不能解決多線程同步的問(wèn)題,并不能保證同一時(shí)刻只能有一個(gè)線程操作全局變量,使用全局變量時(shí)要注意此問(wèn)題。全局變量的例子:
int g_iCount = 0;
void *thread_func(void *ptr)
{
g_iCount++;
printf(“count = %d\n”, g_iCount);
return NULL;
}
文件映射是一種可以允許多個(gè)進(jìn)程共享同一個(gè)文件的用戶級(jí)IPC機(jī)制,可以將一段物理地址映射到用戶空間,進(jìn)程可以訪問(wèn)該物理地址,獲取文件中存儲(chǔ)的數(shù)據(jù),也可以將用戶修改的數(shù)據(jù)寫(xiě)入文件,各個(gè)進(jìn)程間只要完成同一個(gè)文件的映射就可以互相訪問(wèn)和通信。比如:
int fd;
char *pAddr;
// … 打開(kāi)文件等
fd = open(…);
// 建立映射區(qū)
pAddr = mmap(…);
// 共享文件資源
// .. 修改或讀取文件
// 釋放映射區(qū)
munmap(…);
消息隊(duì)列是指系統(tǒng)提供的消息傳遞機(jī)制,最重要的優(yōu)點(diǎn)是可以實(shí)現(xiàn)異步數(shù)據(jù)交換,首先需要定義一個(gè)消息隊(duì)列,每一個(gè)消息隊(duì)列可以接收的消息總數(shù)有限,發(fā)送進(jìn)程把消息發(fā)送到消息隊(duì)列,無(wú)論接收進(jìn)程此時(shí)是否在線,消息隊(duì)列能夠存放消息,而且可以把一個(gè)消息發(fā)送給多個(gè)進(jìn)程,消息隊(duì)列可以利用頭文件sys/msg.h,它包含標(biāo)準(zhǔn)Linux C函數(shù)msgget,msgctl,msgrcv和msgsnd等函數(shù)。如下:
#include
#include
#include
// 獲取消息隊(duì)列ID
int msqid=msgget(MSGKEY, PERMS);
// 發(fā)送消息給消息隊(duì)列
msgsnd(msqid, &msg, sizeof(msgbuf.mtext));
// 接收消息
msgrcv(msqid, &msg, sizeof(msgbuf.mtext), 0, 0);
最后要講的是套接字,他是網(wǎng)絡(luò)編程的一部分,是兩個(gè)進(jìn)程之間交換數(shù)據(jù)的接口,類似管道或FIFO。一個(gè)進(jìn)程可以創(chuàng)建套接字來(lái)接收數(shù)據(jù),另一個(gè)進(jìn)程可以通過(guò)這個(gè)套接字發(fā)送數(shù)據(jù),例如通過(guò)使用頭文件,就可以實(shí)現(xiàn)套接字編程,調(diào)用socket函數(shù)來(lái)生成一個(gè)服務(wù)器端的套接字:
// 創(chuàng)建一個(gè)套接字
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in cliaddr;
// 設(shè)置要連接的服務(wù)器地址
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(PORT);
// 執(zhí)行連接
connect(sockfd, (struct sockaddr *)&cliaddr, sizeof(
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開(kāi)發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡(jiǎn)單好用,價(jià)格厚道的香港/美國(guó)云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動(dòng)、聯(lián)通機(jī)房等。
分享標(biāo)題:Linux線程間通信機(jī)制研究(linux線程通信)
新聞來(lái)源:http://m.fisionsoft.com.cn/article/copiogo.html


咨詢
建站咨詢
