线程间同步

线程间同步是多线程的难点,若关键代码片段同时执行会导致不可预期结果,甚至使程序core dump。一般使用互斥锁解决线程间同步问题,通过让线程中关键代码不并行运行,遇到代码时确认锁是否释放,未释放则阻塞,以此保证互斥。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程间同步是多线程的难点之一,它确保多线程程序不会同时执行某些关键的代码片段,否则这些关键代码片段同时执行就会导致不可预期。最严重的可能会引起整个程序的core dump。线程间同步问题一般使用互斥锁来解决。

pthread_t tid[2]; 
int counter; 
void* trythis(void *arg) 
{ 
	for(i=0; i<(0xFFFFFFFF);i++);// 准备瓜 
	unsigned long i = 0; 
	counter += 1; 
	printf("\n 永强开始吃第 %d 个瓜\n", counter); 
	for(i=0; i<(0xFFFFFFFF);i++); 
	printf("\n 永强吃完第 %d 个瓜\n", counter); 
	return NULL; 
} 
int main(void) 
{ 
	int i = 0; 
	int error; 
	while(i < 2) 
	{ 
		error = pthread_create(&(tid[i]), NULL, &trythis, NULL); 
		if (error != 0) 
			printf("\nThread can't be created : [%s]", strerror(error)); 
		i++; 
	} 
	pthread_join(tid[0], NULL); 
	pthread_join(tid[1], NULL); 
	return 0; 
} 

程序输出:

永强开始吃第1个瓜
永强开始吃第2个瓜
永强吃完第2个瓜
永强吃完第2个瓜

可以看出因为for(i=0; i<(0xFFFFFFFF);i++)(吃瓜时间); 运行时间较长,counter的值在两个线程中都进行了改变,因此结果只有永强吃完第2个瓜,没有永强吃完第1个瓜。
在这里

	counter += 1; 
	printf("\n 永强开始吃第 %d 个瓜\n", counter); 
	for(i=0; i<(0xFFFFFFFF);i++); 
	printf("\n 永强吃完第 %d 个瓜\n", counter); 

这段算是关键代码了(或者也叫共享资源),不能同时进行更改,这时可以采用互斥锁,让线程中这段代码不并行运行。
这里也比较容易理解,对于这段程序来说,准备瓜的过程,是可以并行的,比如王大拿、刘英都可以过来帮助永强把瓜准备好,比如买瓜、洗瓜、切瓜,一切准备就绪了, 永强一个个吃,永强吃的过程,不能同时吃几个,各个线程遇到这段代码,需要确认是否锁已经释放,某则就一直阻塞着,以这种方式来保证互斥

void* trythis(void *arg) 
{ 
	for(i=0; i<(0xFFFFFFFF);i++);// 准备瓜 
	unsigned long i = 0; 
	pthread_mutex_lock(&lock);  // 吃瓜锁
	counter += 1; 
	printf("\n 永强开始吃第 %d 个瓜\n", counter); 
	for(i=0; i<(0xFFFFFFFF);i++); 
	printf("\n 永强吃完第 %d 个瓜\n", counter); 
    pthread_mutex_unlock(&lock); // 瓜吃完了解锁;
	return NULL; 
} 

以上的的代码的输出应该是:

永强开始吃第1个瓜
永强吃完第1个瓜
永强开始吃第2个瓜
永强吃完第2个瓜
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手持电烙铁的侠客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值