c主线程如何等待子线程结束 linux_使用互斥量进行同步 - Linux C进程与多线程入门_Linux编程_Linux公社-Linux系统门户网站...
互斥
簡單地理解就是,一個線程進入工作區(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机图形学——图形和图像
- 下一篇: linux监测node进程,通过node