0
点赞
收藏
分享

微信扫一扫

20220920线程属性

是她丫 2022-09-23 阅读 184
jvm

 互斥锁

使用mutex(互斥量)一般步骤
1.pthread_mutex_t mutex;创建锁
2.pthread_mutex_init:初始化
3.pthread_mutex_lock:加锁
4访问共享数据(stdout)
5.pthread_mutex_unlock:解锁
6.pthread_mutex_destroy:销毁锁

#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
//pthread_mutex_t 互斥锁类型名,
pthread_mutex_t mutex;//定义另一个互斥锁变量mutex,全局变量,所有线程可以共享使用

void *tfn2(void *arg)
{//当某个线程,不进行对共享资源进行加锁操作时,仍旧会造成抢夺资源现象
	srand(time(NULL));
	while(1)
	{
		int ret=pthread_mutex_trylock(&mutex);
		if(ret!=0)
		{
			printf("pthread_mutx_trylock err:%s\n",strerror(ret));
		}
		else
		{
			printf("---tfn2()---print ");
			sleep(rand() % 3);
			printf("to stdout\n");
			sleep(rand() % 3);
			ret=pthread_mutex_unlock(&mutex);//解锁	
			if(ret!=0)
			{	
				fprintf(stderr,"pthread_mutex_unlock() error:%s\n",strerror(ret));
			}
		}
			printf("common tfn2()------\n");
			sleep(rand() % 3);
	}
}

void *tfn(void *arg)
{
	srand(time(NULL));
	while (1) 
	{	
		int ret=pthread_mutex_lock(&mutex);//加锁
		if(ret!=0)
		{
			fprintf(stderr,"pthread_mutex_lock() error:%s\n",strerror(ret));
		}
		printf("hello ");
		sleep(rand() % 3);
		printf("world\n");
		//pthread_mutex_unlock(),对加锁成功的共享资源进行解锁
		ret=pthread_mutex_unlock(&mutex);//解锁	
		if(ret!=0)
		{
			fprintf(stderr,"pthread_mutex_unlock() error:%s\n",strerror(ret));
		}
		sleep(rand() % 3);

	}
	return NULL;
}

int main(void)
{
	pthread_t tid;
	srand(time(NULL));
	//pthread_mutex_init()初始化 互斥锁
	int ret=pthread_mutex_init(&mutex,NULL);//初始化锁
	if(ret!=0)
	{
		fprintf(stderr,"mutex init error:%s\n",strerror(ret));
	}
	//pthread_create() 创建线程1	
	ret=pthread_create(&tid, NULL, tfn, NULL);
	if(ret!=0)
	{
		fprintf(stderr,"pthread_create error:%s\n",strerror(ret));
	}
	//pthread_create() 创建线程2
	ret=pthread_create(&tid, NULL, tfn2, NULL);
	if(ret!=0)
	{
		fprintf(stderr,"pthread_create error:%s\n",strerror(ret));
	}
	while (1) 
	{	//pthread_mutex_lock()给已初始化过的互斥锁变量,(站在当前线程角度)对共享资源进行加锁操作
		//如果加锁失败,则阻塞,也就是一直等待
		ret=pthread_mutex_lock(&mutex);//加锁
		if(ret!=0)
		{
			fprintf(stderr,"pthread_mutex_lock() error:%s\n",strerror(ret));
		}
		printf("HELLO ");
		sleep(rand() % 3);
		printf("WORLD\n");
		//pthread_mutex_unlock(),对加锁成功的共享资源进行解锁
		ret=pthread_mutex_unlock(&mutex);//解锁	
		if(ret!=0)
		{
			fprintf(stderr,"pthread_mutex_unlock() error:%s\n",strerror(ret));
		}
		sleep(rand() % 3);
	}
	pthread_join(tid, NULL);
	ret=pthread_mutex_destroy(&mutex);//销毁锁
	if(ret!=0)
	{
		fprintf(stderr,"pthread_mutex_destroy() error:%s\n",strerror(ret));
	}

	return 0;
}

读写锁

特别强调,读写锁只有一把,但具备两种状态:
1读模式下加锁状态(读锁)
2.写模式下加锁状态(写锁)

特征:
1.读写锁是“写模式加锁”成功时,其它线程加锁都会被阻塞
2.读写锁“读模式加锁”成功时,其他线程以写模式加锁会阻塞
3.读锁、写锁并行阻塞,写锁优先级高。读锁也叫共享

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int counter=0;
//用pthread_rwlock_t类型,定义读写锁变量rwlock
pthread_rwlock_t rwlock;
/* 3个线程不定时写同一全局资源,5个线程不定时读同一全局资源*/
void *th_write(void *arg)
{
	int t;
	int i = (long int)arg;
	while (1) 
	{
		pthread_rwlock_wrlock(&rwlock);//以写模式加锁
		t = counter;
		counter++;
//		sleep(1);
		printf("=====write i=%d:tid=%lu:counter=%d ++counter=%d\n", i, pthread_self(), t, counter);
		pthread_rwlock_unlock(&rwlock);
		sleep(1);
	}
	return NULL;
}

void *th_read(void *arg)
{
	int i = (long int)arg;
	while (1) 
	{
		pthread_rwlock_rdlock(&rwlock);//读线程间,读锁共享
		printf("----------------------read i=%d:tid=%lu:counter=%d\n", i, pthread_self(), counter);
		pthread_rwlock_unlock(&rwlock);
		usleep(100000);
	}
	return NULL;
}

int main(void)
{
	long int i;
	pthread_t tid[8];
	pthread_rwlock_init(&rwlock, NULL);
	
	for(i=0;i<3;i++)
	{
		pthread_create(&tid[i], NULL, th_write, (void *)i); 
	}
	
	for(i=0;i<5;i++)
	{
		pthread_create(&tid[i+3], NULL, th_read, (void *)i);
	}
	
	for(i=0;i<8;i++)
	{
		pthread_join(tid[i], NULL);
	}
	
	pthread_rwlock_destroy(&rwlock);

	return 0;
}
举报

相关推荐

0 条评论