c語言線程互斥鎖執行個體
實驗要求
在Linux使用C語言編輯程式使用互斥鎖實作兩個線程之間同步,一個線程負責從标準輸入裝置中讀取資料,而另一個線程則負責将讀入的資料輸出到标準輸出裝置上,當輸入“end”時結束該程式。
編寫思路
建立線程後通過睡眠進入子線程上鎖,判斷退出标志,輸出提示資訊,存入數組解鎖,睡眠進入主線程,判斷數組内容,
為退出符号時,指派退出标志,解鎖睡眠進入子線程,結束子線程後傳回主線程回收子線程退出整個程序
為空解鎖睡眠進入子線程上鎖輸出提示資訊,存入數組解鎖,睡眠進入主線程,其餘情況則列印資料,解鎖睡眠進入子線程實作循環
具體代碼
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#include <string.h>
/*建立線程後通過睡眠進入子線程上鎖,判斷退出标志,
輸出提示資訊,存入數組解鎖,睡眠進入主線程,判斷數組内容,
為退出符号時,指派退出标志,解鎖睡眠進入子線程,結束子線程後傳回主線程回收子線程退出整個程序
為空解鎖睡眠進入子線程上鎖輸出提示資訊,存入數組解鎖,睡眠進入主線程
其餘情況則列印資料,解鎖睡眠進入子線程實作循環*/
void *thread_function(void *arg);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t work_mutex; /*全局互斥鎖對象,首先應該定義一個這樣的互斥鎖*/
#define WORK_SIZE 1024 /*全局共享資料去*/
char work_area[WORK_SIZE];
int quit = 0; //退出标志
int main(int argc, char *argv[])
{
pthread_t a;
if (pthread_mutex_init(&work_mutex, NULL) != 0)
{
perror(" work_mutex init failed ");
exit(0);
}
if (pthread_create(&a, NULL, thread_function, NULL) != 0)
{
perror("thread create failed");
exit(0);
}
sleep(1); //睡眠確定進入先子線程
while (1)
{
if (pthread_mutex_lock(&work_mutex) != 0) //上鎖
{
perror("pthread_mutex_lock");
}
if (strcmp("end\n", work_area) == 0) //判斷是否為退出資料
{ //列印退出資訊
quit = 1; //指派退出标記
if (pthread_mutex_unlock(&work_mutex) != 0) //解鎖
{
perror(" cannot work_mutex unlock ");
exit(0);
}
sleep(1); //睡眠進入先子線程
pthread_join(a, NULL); //回收子線程
printf("程式正在退出\n");
exit(0); //退出程序
}
else
{
while (work_area[0] != '\n') //&& work_area[0] != '\0'
{
printf("您輸入的字元是:%s", work_area);
printf("您輸入的字元長度為:%d\n", strlen(work_area) - 1);
memset(work_area, '\0', sizeof(work_area)); //數組清零
}
if (pthread_mutex_unlock(&work_mutex) != 0) //解鎖睡眠進入子線程實作循環*/
{
perror(" cannot work_mutex unlock ");
exit(0);
}
sleep(1);
}
}
}
void *thread_function(void *arg) /*自定義函數*/
{
while (1)
{
if (pthread_mutex_lock(&work_mutex) != 0) //上鎖
{
perror("pthread_mutex_lock");
}
if(quit !=1) //判斷解鎖标志
{
printf("請您輸入字元,輸入end退出程式\n");
fgets(work_area, WORK_SIZE, stdin); // 數組指派
pthread_mutex_unlock(&work_mutex); //解鎖進入主線程
sleep(1);
}
else //為判斷标志時解鎖結束子線程,進入父線程
{
pthread_mutex_unlock(&work_mutex);
pthread_exit(0);
}
}
}