天天看點

c語言線程互斥鎖執行個體c語言線程互斥鎖執行個體

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);
		}
    }
}

           

小結

程式設計時需了解互斥鎖含義,正确上鎖、解鎖,以及線程之間執行順序問題,還有對于條件判斷問題,最後對于子線程的回收。

繼續閱讀