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

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


咨詢
建站咨詢
