新聞中心
隨著計(jì)算機(jī)科學(xué)技術(shù)的不斷發(fā)展,多線程技術(shù)逐漸成為程序設(shè)計(jì)中不可或缺的一部分。而Linux作為一種開源的操作系統(tǒng),其中的pthread多線程技術(shù)更是被廣泛應(yīng)用于大大小小的項(xiàng)目中。本文將深入探究Linux中的pthread多線程技術(shù),并從以下三個(gè)方面詳細(xì)介紹:線程的創(chuàng)建與銷毀、線程同步、線程通信。

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比無極網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式無極網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋無極地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴。
一、線程的創(chuàng)建與銷毀
在Linux中,創(chuàng)建線程的方法十分簡(jiǎn)單,只需要使用pthread_create()函數(shù)即可。
pthread_create()函數(shù)的聲明如下:
`int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);`
這個(gè)函數(shù)有四個(gè)參數(shù),分別如下:
– **thread**:是指向pthread_t類型的指針,用來存儲(chǔ)新線程的ID。
– **attr**:是指向pthread_attr_t類型的指針,它用來設(shè)置新線程的屬性。
– **start_routine**:是一個(gè)指向函數(shù)的指針,它代表新線程所要執(zhí)行的函數(shù)。
– **arg**:是一個(gè)指針,在新線程啟動(dòng)后作為參數(shù)傳遞給start_routine函數(shù)。
一個(gè)簡(jiǎn)單的創(chuàng)建線程的示例代碼如下:
“`
#include
#include
void *myThread(void *arg)
{
printf(“This is myThread!\n”);
pthread_exit(NULL);
}
int mn()
{
pthread_t tid;
pthread_create(&tid, NULL, myThread, NULL);
printf(“This is mn thread!\n”);
pthread_exit(NULL);
}
“`
在上面的代碼中,我們創(chuàng)建了一個(gè)名為myThread的函數(shù),它被用作新線程執(zhí)行函數(shù)的入口點(diǎn)。然后在主函數(shù)中,我們使用pthread_create()函數(shù)創(chuàng)建了一個(gè)名為tid的線程,并將myThread函數(shù)作為新線程的入口點(diǎn)。最后我們用pthread_exit()函數(shù)來結(jié)束程序,并等待所有線程退出。
線程的銷毀也非常簡(jiǎn)單,只需要使用pthread_exit()函數(shù)即可。這個(gè)函數(shù)的作用是結(jié)束當(dāng)前線程,并將返回值傳遞給父線程。
二、線程同步
線程同步是一個(gè)十分重要的概念,它指的是確保多個(gè)線程在某一時(shí)刻執(zhí)行的順序是被正確安排的。在Linux中,有許多技術(shù)可以用于線程同步,比如互斥鎖、信號(hào)量、條件變量等等。
1、互斥鎖
互斥鎖是線程同步中最常用的技術(shù)之一。它可以確保一段關(guān)鍵代碼在任意時(shí)刻只能有一個(gè)線程在執(zhí)行,從而確保了代碼的正確性。
在Linux中,互斥鎖使用pthread_mutex_t結(jié)構(gòu)體來表示。pthread_mutex_lock()函數(shù)可以鎖住互斥鎖,而pthread_mutex_unlock()函數(shù)則可以釋放它。
一個(gè)簡(jiǎn)單的互斥鎖示例代碼如下:
“`
#include
#include
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int count = 0;
void *myThread(void *arg)
{
for(int i=0; i
{
pthread_mutex_lock(&mutex);
count++;
pthread_mutex_unlock(&mutex);
}
pthread_exit(NULL);
}
int mn()
{
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, myThread, NULL);
pthread_create(&tid2, NULL, myThread, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
printf(“count = %d\n”, count);
pthread_exit(NULL);
}
“`
在上面的代碼中,我們定義了一個(gè)名為mutex的互斥鎖,并將它初始化為PTHREAD_MUTEX_INITIALIZER。在myThread函數(shù)中,我們使用互斥鎖來確保count變量的安全訪問。我們使用pthread_join()函數(shù)來等待兩個(gè)線程退出,并打印出count的值。
2、信號(hào)量
信號(hào)量是另一種用于線程同步的技術(shù)。它可以用來控制對(duì)共享資源的訪問,從而確保線程之間的正確協(xié)調(diào)。
在Linux中,信號(hào)量使用sem_t結(jié)構(gòu)體來表示。sem_wt()函數(shù)可以鎖住信號(hào)量,sem_post()函數(shù)則可以釋放它。
一個(gè)簡(jiǎn)單的信號(hào)量示例代碼如下:
“`
#include
#include
#include
sem_t sem;
int count = 0;
void *myThread(void *arg)
{
for(int i=0; i
{
sem_wt(&sem);
count++;
sem_post(&sem);
}
pthread_exit(NULL);
}
int mn()
{
sem_init(&sem, 0, 1);
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, myThread, NULL);
pthread_create(&tid2, NULL, myThread, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
printf(“count = %d\n”, count);
pthread_exit(NULL);
}
“`
在上面的代碼中,我們使用sem_init()函數(shù)初始化了一個(gè)名為sem的信號(hào)量。在myThread函數(shù)中,我們使用信號(hào)量來確保count變量的安全訪問。我們使用pthread_join()函數(shù)來等待兩個(gè)線程退出,并打印出count的值。
3、條件變量
條件變量是另一種用于線程同步的技術(shù)。它可以讓線程在特定的條件下等待或被喚醒,從而達(dá)到線程之間相互通信的目的。
在Linux中,條件變量使用pthread_cond_t結(jié)構(gòu)體來表示。pthread_cond_wt()函數(shù)可以讓線程在條件變量上等待,pthread_cond_signal()函數(shù)則可以喚醒它。
一個(gè)簡(jiǎn)單的條件變量示例代碼如下:
“`
#include
#include
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int flag = 0;
void *thread1(void *arg)
{
pthread_mutex_lock(&mutex);
flag = 1;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
void *thread2(void *arg)
{
pthread_mutex_lock(&mutex);
while(flag == 0)
{
pthread_cond_wt(&cond, &mutex);
}
printf(“Thread2\n”);
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int mn()
{
pthread_t tid1, tid2;
pthread_create(&tid1, NULL, thread1, NULL);
pthread_create(&tid2, NULL, thread2, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
pthread_exit(NULL);
}
“`
在上面的代碼中,我們創(chuàng)建了兩個(gè)線程,分別執(zhí)行thread1和thread2函數(shù)。在thread1函數(shù)中,我們將flag變量設(shè)置為1,并通過調(diào)用pthread_cond_signal()函數(shù)喚醒在條件變量上等待的線程。在thread2函數(shù)中,我們循環(huán)等待flag變量被設(shè)置為1,并打印出”Thread2″。
三、線程通信
線程通信是指通過某種機(jī)制,使得一個(gè)線程可以向另一個(gè)線程傳遞數(shù)據(jù)或信息。在Linux中,常常使用共享內(nèi)存、消息隊(duì)列等技術(shù)來實(shí)現(xiàn)線程通信。
1、共享內(nèi)存
共享內(nèi)存是一種允許多個(gè)線程共享內(nèi)存區(qū)域的技術(shù)。在Linux中,可以使用shm_open()函數(shù)和mmap()函數(shù)來創(chuàng)建和映射共享內(nèi)存區(qū)域。
一個(gè)簡(jiǎn)單的共享內(nèi)存示例代碼如下:
“`
#include
#include
#include
#include
#include
int mn()
{
const char *name = “/shmtest”;
const int SIZE = 4096;
int shm_fd;
void *ptr;
shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
sprintf((char *)ptr, “Hello, world!”);
printf(“%s\n”, (char *)ptr);
munmap(ptr, SIZE);
shm_unlink(name);
return 0;
}
“`
在上面的代碼中,我們創(chuàng)建了一個(gè)名為”/shmtest”的共享內(nèi)存區(qū)域,并將它映射到了內(nèi)存空間中。然后我們向共享內(nèi)存區(qū)域?qū)懭肓艘恍?shù)據(jù),并打印出來。最后我們釋放了共享內(nèi)存,并刪除了它。
2、消息隊(duì)列
消息隊(duì)列是另一種用于線程通信的技術(shù)。它可以讓一個(gè)線程向另一個(gè)線程發(fā)送消息,從而實(shí)現(xiàn)線程之間的數(shù)據(jù)交換。
在Linux中,可以使用msgget()函數(shù)、msgsnd()函數(shù)和msgrcv()函數(shù)來創(chuàng)建和使用消息隊(duì)列。
一個(gè)簡(jiǎn)單的消息隊(duì)列示例代碼如下:
“`
#include
#include
#include
#include
#include
#include
#include
#include
struct msgbuf
{
long mtype;
char mtext[128];
};
int mn()
{
key_t key;
int msgid;
struct msgbuf buf;
key = ftok(“/tmp/msg.temp”, 1);
msgid = msgget(key, 0666 | IPC_CREAT);
buf.mtype = 1;
strncpy(buf.mtext, “Hello, world!”, sizeof(buf.mtext));
msgsnd(msgid, &buf, sizeof(buf.mtext), 0);
msgrcv(msgid, &buf, sizeof(buf.mtext), 1, 0);
printf(“%s\n”, buf.mtext);
msgctl(msgid, IPC_RMID, NULL);
return 0;
}
“`
在上面的代碼中,我們創(chuàng)建了一個(gè)名為”/tmp/msg.temp”的key,并使用ftok()函數(shù)將它轉(zhuǎn)換成key_t類型。然后我們使用msgget()函數(shù)創(chuàng)建了一個(gè)消息隊(duì)列,將一條消息發(fā)送到隊(duì)列中,并從隊(duì)列中接收一條消息并打印出來。最后我們通過msgctl()函數(shù)刪除了這個(gè)消息隊(duì)列。
相關(guān)問題拓展閱讀:
- LINUX 的pthread_sigmask含義
- linux下線程pthread編譯時(shí)為什么要加lpthread
LINUX 的pthread_sigmask含義
是的。
pthread_sigmask(SIG_BLOCK, &newmask, &oldmask)這句話代表線程理睬newmask和oldmask信號(hào)集面信號(hào)。
一個(gè)進(jìn)程的信號(hào)屏蔽字規(guī)定了當(dāng)前阻塞而不能搭指如遞送給該進(jìn)程的信號(hào)知啟集。
當(dāng)前的信號(hào)屏蔽字會(huì)由oldmask指針返回。
參數(shù):SIG_BLOCK 表示 該進(jìn)程新的信號(hào)屏蔽字是其當(dāng)前逗拍信號(hào)屏蔽字和set指向信號(hào)集的并集。newmask中包含了我們希望阻塞的附加信號(hào)。
linux下線程pthread編譯時(shí)為什么要加lpthread
shibixiao | 六級(jí)
lpthread是表示要連接到pthread的庫是這讓脊里省略的lib,你應(yīng)該可以找到共享庫libpthread.so的兆滑蔽
因?yàn)閜thread編程用到的函數(shù)在pthread庫里族州面,就像你使用pow等數(shù)學(xué)計(jì)算函數(shù),需要用到math.h
需要 -lm
lpthread是表模顫示要連接到pthread的庫是這里省略信搭的lib,你應(yīng)該可以找到共享旦坦敗庫libpthread.so的
加共享庫
關(guān)于linux里-pthread的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)。專業(yè)提供云主機(jī)、虛擬主機(jī)、域名注冊(cè)、VPS主機(jī)、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
標(biāo)題名稱:深入探究:linux中的pthread多線程技術(shù)(linux里-pthread)
網(wǎng)站網(wǎng)址:http://www.dlmjj.cn/article/coisdpd.html


咨詢
建站咨詢
