日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

c主线程如何等待子线程结束 linux_使用互斥量进行同步 - Linux C进程与多线程入门_Linux编程_Linux公社-Linux系统门户网站...

發(fā)布時間:2023/12/13 linux 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c主线程如何等待子线程结束 linux_使用互斥量进行同步 - Linux C进程与多线程入门_Linux编程_Linux公社-Linux系统门户网站... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

互斥

簡單地理解就是,一個線程進入工作區(qū)后,如果有其他線程想要進入工作區(qū),它就會進入等待狀態(tài),要等待工作區(qū)內(nèi)的線程結(jié)束后才可以進入。

基本函數(shù)

(1) pthread_mutex_init函數(shù)

原型:int pthread_mutex_init ( pthread_mutex_t *mutex, const pthread_mutexattr_t* attr);

描述:設(shè)置互斥量的屬性

參數(shù):第一個參數(shù):預(yù)先聲明的pthread_mutex_t對象指針

第二個參數(shù):互斥鎖屬性,NULL表示使用默認屬性

返回值:成功時返回0, 失敗時返回一個錯誤代碼

(2) pthread_mutex_lock函數(shù)

原型:int pthread_mutex_lock ( pthread_mutex_t *mutex );

描述:pthread_mutex_lock返回時,互斥鎖被鎖定,如果這個互斥鎖被一個線程鎖定和擁有,那么另一個線程要調(diào)用這 個函數(shù)會進入堵塞狀態(tài)(即等待狀態(tài)),直到互斥鎖被釋放為止。

返回值:成功時返回0, 失敗時返回一個錯誤代碼

(3) pthread_mutex_unlock函數(shù)

原型:int pthread_mutex_unlock ( pthread_mutex_t *mutex );

描述:釋放互斥鎖

返回值:成功時返回0, 失敗時返回一個錯誤代碼

(4) pthread_mutex_destroy函數(shù)

原型:int pthread_mutex_destroy ( pthread_mutex_t *mutex );

描述:刪除互斥鎖

返回值:成功時返回0, 失敗時返回一個錯誤代碼

實例

lock.c文件

描述:這個程序主要可以概括為主線程負責接受輸入的字符串,而子線程則負責統(tǒng)計并輸出字符數(shù)。

#include

#include

#include

#include

#include

void *thread_function(void *arg);

pthread_mutex_t work_mutex;

#define WORK_SIZE 1024

char work_area[WORK_SIZE];

int time_to_exit = 0;

int main() {

int res;

pthread_t a_thread;

void *thread_result;

/*初始化互斥量*/

res = pthread_mutex_init(&work_mutex, NULL);

if (res != 0) {

perror("互斥量初始化失敗!");

exit(EXIT_FAILURE);

}

/*啟動新線程*/

res = pthread_create(&a_thread, NULL, thread_function, NULL);

if (res != 0) {

perror("線程創(chuàng)建失敗");

exit(EXIT_FAILURE);

}

pthread_mutex_lock(&work_mutex);

printf("請輸入一些文本內(nèi)容. 輸入“end”結(jié)束\n");

while(!time_to_exit) {

fgets(work_area, WORK_SIZE, stdin);

pthread_mutex_unlock(&work_mutex);

while(1) {

pthread_mutex_lock(&work_mutex);

/*統(tǒng)計字符工作未完成*/

if (work_area[0] != '\0') {

pthread_mutex_unlock(&work_mutex);

sleep(1);

}

else {

/*統(tǒng)計字符工作完成,跳出內(nèi)層循環(huán),重新讀取輸入*/

break;

}

}

}

pthread_mutex_unlock(&work_mutex);

printf("\n等待線程結(jié)束...\n");

res = pthread_join(a_thread, &thread_result);

if (res != 0) {

perror("Thread join failed");

exit(EXIT_FAILURE);

}

printf("Thread joined\n");

pthread_mutex_destroy(&work_mutex);

exit(EXIT_SUCCESS);

}

/*主線程首先鎖定工作區(qū),在獲取輸入的字符后,釋放工作區(qū),讓其他線程對字符個數(shù)進行統(tǒng)計。work_area[0[為空字符時表示統(tǒng)計結(jié)束。通過周期性地對互斥量進行加鎖,檢查是否已經(jīng)統(tǒng)計完。*/

/*在線程中要執(zhí)行的代碼*/

void *thread_function(void *arg) {

sleep(1);

pthread_mutex_lock(&work_mutex);

while(strncmp("end", work_area, 3) != 0) {

printf("你輸入了 %d 個字符\n", strlen(work_area) -1);

work_area[0] = '\0';

pthread_mutex_unlock(&work_mutex);

sleep(1);

pthread_mutex_lock(&work_mutex);

while (work_area[0] == '\0' ) {

pthread_mutex_unlock(&work_mutex);

sleep(1);

pthread_mutex_lock(&work_mutex);

}

}

time_to_exit = 1;

work_area[0] = '\0';

pthread_mutex_unlock(&work_mutex);

pthread_exit(0);

}

/*在新線程一上來先試圖對互斥量進行加鎖。如果它已經(jīng)被鎖上,新線程就會進入堵塞狀態(tài)知道互斥鎖釋放為止,一旦可以進入工作區(qū),就先檢查是否有退出請求(end)如果有,就設(shè)置time_to_exit變量和work_area,然后退出程序。

如果沒有退出,那么就對字符個數(shù)進行統(tǒng)計。把work_area[0]設(shè)置為空,表示統(tǒng)計工作完成。接下來就釋放互斥鎖,等待主線程的運行,周期性地給互斥量加鎖,如果加鎖成功,就檢查主線程是否又給我們新的字符串統(tǒng)計。如果沒有,就釋放互斥鎖繼續(xù)等待,*/

編譯執(zhí)行:gcc -D_REENTRANT fork.c -o fork -lpthread

運行結(jié)果如下:

���考文獻:Linux程序設(shè)計

總結(jié)

以上是生活随笔為你收集整理的c主线程如何等待子线程结束 linux_使用互斥量进行同步 - Linux C进程与多线程入门_Linux编程_Linux公社-Linux系统门户网站...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。