linux线程-使用互斥量同步

Posted 为了维护世界和平_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux线程-使用互斥量同步相关的知识,希望对你有一定的参考价值。

互斥量:允许程序员锁住某个对象,使得每次只能有一个线程访问它

互斥量相关的函数

#include<pthread.h>
//初始化
int  pthread_mutex_init(pthread_mutex_t  mutex,const pthread_mutexattr_t *mutexattr);
//加锁
int pthread_mutex_lock(pthread_mutex_t  *mutex);
//解锁
int pthread_mutex_unlock(pthread_mutex_t  *mutex);
//销毁
int pthread_mutex_destroy(pthread_mutex_t  *mutex)

临界区资源 work_area,time_to_exit

主线程获取输入,子线程统计字符串大小

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<semaphore.h>
#include<pthread.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 res;
	pthread_t a_thread;
	void *thread_result;

	memset(work_area,0,sizeof(work_area));

	res = pthread_mutex_init(&work_mutex,NULL);
	if(res != 0)
	
		perror("Semaphore initialization failed\\n");
		exit(EXIT_FAILURE);
	

	res = pthread_create(&a_thread,NULL,thread_function,NULL);
	if(res !=0)
	
		perror("Thread creation failed");
		exit(EXIT_FAILURE);
	
	pthread_mutex_lock(&work_mutex);
	printf("Input some txt,Enter 'end' to finish\\n");
	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("\\n Waiting for thread to finish...\\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);



void *thread_function(void *arg)

	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 = 1;
	work_area[0]='\\0';
	pthread_mutex_unlock(&work_mutex);
	pthread_exit(0);

打印输出

(base) wy@ubuntu:~/process$ ./thread4 
Input some txt,Enter 'end' to finish
hello 
You input 5 characters
end

 Waiting for thread to finish...
Thread joined

以上是关于linux线程-使用互斥量同步的主要内容,如果未能解决你的问题,请参考以下文章

linux多线程——互斥量实现同步

线程资源同步——互斥量和条件变量

Linux 多线程同步机制:互斥量信号量条件变量

(转载)Linux 多线程条件变量同步

Linux___线程互斥与同步

Linux多线程——互斥和同步