周梦康 发表于 2015-11-26 4345 次浏览 标签 : Linuxpthread

多线程编程从头至尾需要考虑的就是线程之间的协调与同步。Linux提供了三种同步机制:互斥、信号量、条件变量。

互斥锁提供了对共享资源的一种保护访问。哈哈,怎么感觉互斥锁就是火车上的公共厕所里的那把锁呢?我在蹲坑,你们都等着。虽然厕所是共享的,但是互斥锁就对坑(这一共享资源)进行了很好的保护。

互斥锁变量pthread_mutex_t
互斥锁属性变量pthread_mutexattr_t
初始化互斥锁属性变量pthread_mutexattr_init()
设置互斥锁属性pthread_mutexattr_settypepthread_mutexattr_setpshared
获取互斥锁属性pthread_mutexattr_gettypepthread_mutexattr_getpshared
取消互斥锁属性pthread_mutexattr_destroy
初始化互斥锁变量pthread_mutex_init()
上锁pthread_mutex_lock()
判断上锁pthread_mutex_trylock()
解锁pthread_mutex_unlock()
销毁锁pthread_mutex_destroy()


下面该例程使用互斥锁实现主从线程之间的同步,其中,主线程负责从标准输入设备中读取数据并保存到全局变量work_area之中,而从线程则负责将全局变量

work_area中的数据输出到标准输出设备上。

具体实现

  1. 主线程调用fgets()函数接受一行用户的键盘输入数据并讲起保存到全局变量work_area中,当用户按下回车键时,从线程将会把work_area中的数据输出到标准输出设备上并将work_area缓存中的数据清空。

  2. 当输入end字符串时,程序结束退出。(好像没有出效果,这本教科书上代码还真是坑挺多的。暂时还没理解透彻,所以也没检查处错误。)

https://github.com/zhoumengkang/notes/blob/master/unix/pthread/mutex.c

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <semaphore.h>
#include <time.h>

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 argc, char const *argv[])
{
	pthread_t a_thread;
	void * thread_result;

	if (pthread_mutex_init(&work_mutex,NULL) != 0)
	{
		perror("mutex pthread_mutex_init failed");
		exit(EXIT_FAILURE);
	}

	if (pthread_create(&a_thread,NULL,thread_function,NULL) != 0)
	{
		perror("threae create failed");
		exit(EXIT_FAILURE);
	}

	pthread_mutex_lock(&work_mutex);

	printf("input some text, enter 'end' to finish\n");

	/* time_to_exit 等于 0 ,即表示用户键盘输入尚未结束,其值从线程修改更新 */
	while(!time_to_exit)
	{
		fgets(work_area,WORK_SIZE,stdin);
		pthread_mutex_unlock(&work_mutex);
		while(1)
		{
			pthread_mutex_lock(&work_mutex);
			if (work_area[0] != '\0')
			{
				pthread_mutex_unlock(&work_mutex);
				sleep(1);
			}
			else
			{
				break;
			}
		}
	}

	pthread_mutex_unlock(&work_mutex);

	printf("waiting for thread to finish\n");

	if (pthread_join(a_thread,&thread_result) != 0)
	{
		perror("pthread_join failed\n");
		exit(EXIT_FAILURE);
	}

	printf("thread joined\n");

	pthread_mutex_destroy(&work_mutex);

	exit(EXIT_SUCCESS);

}

void * thread_function(void * arg)
{
	printf("time: %d a_thread start\n", time(0));
	sleep(1);
	pthread_mutex_lock(&work_mutex);
	while(strncmp("end",work_area,3) != 0)
	{
		printf("you input %d characters\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 = 0;
	work_area[0] = '\0';
	pthread_mutex_unlock(&work_mutex);
	pthread_exit(0);
}


👇 下面是我的公众号,高质量的博文我会第一时间同步到公众号,给个关注吧!

评论列表