c语言线程互斥锁实例

c语言线程互斥锁实例

实验要求

在Linux使用C语言编辑程序使用互斥锁实现两个线程之间同步,一个线程负责从标准输入设备中读取数据,而另一个线程则负责将读入的数据输出到标准输出设备上,当输入“end”时结束该程序。

编写思路

创建线程后通过睡眠进入子线程上锁,判断退出标志,输出提示信息,存入数组解锁,睡眠进入主线程,判断数组内容,
为退出符号时,赋值退出标志,解锁睡眠进入子线程,结束子线程后返回主线程回收子线程退出整个进程
为空解锁睡眠进入子线程上锁输出提示信息,存入数组解锁,睡眠进入主线程,其余情况则打印数据,解锁睡眠进入子线程实现循环

具体代码

#include 
#include 
#include 
#include 
#include 
#include 
/*创建线程后通过睡眠进入子线程上锁,判断退出标志,
输出提示信息,存入数组解锁,睡眠进入主线程,判断数组内容,
为退出符号时,赋值退出标志,解锁睡眠进入子线程,结束子线程后返回主线程回收子线程退出整个进程
为空解锁睡眠进入子线程上锁输出提示信息,存入数组解锁,睡眠进入主线程
其余情况则打印数据,解锁睡眠进入子线程实现循环*/
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);
		}
    }
}

小结

编程时需理解互斥锁含义,正确上锁、解锁,以及线程之间执行顺序问题,还有对于条件判断问题,最后对于子线程的回收。

你可能感兴趣的:(c语言线程)