互斥锁和条件变量

85 篇文章 0 订阅
11 篇文章 0 订阅

多线程同步机制需要两个基本的机制, 即互斥锁和条件变量。 互斥锁防止多个线程并发的访问共享数据区, 保证每一次只有一个线程对共享数据区的数据进行操作。  虽然互斥锁能使得资源互斥的访问, 但是互斥锁并不是万能的。 因为互斥锁容易造成资源的浪费。 比如说线程A和线程B都要访问一个数据区, 但是线程B只有在某个条件满足的时候在执行。 如果使用互斥锁, 那么线程B总是在和线程A竞争资源, 竞争到了资源后, 由于不满足条件, 只能解锁, 重新开始下一轮的竞争资源。

所以我们需要条件变量。 也就是说线程A执行的时候, 发现线程B执行的条件到了, 就发一个信号给B, B 收到信号后, 要等到A解锁之后, 才可以对共享数据区访问。 

<span style="font-size:14px;">#include <pthread.h>
#include <unistd.h> // for sleep() function
#include <stdio.h>
#include <stdlib.h>
//#include <sys/syscall.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; // 互斥锁
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; // 条件变量

void *thread1(void *);
void *thread2(void *);

int i = 0;// 共享资源
int main() {
	pthread_t t_a;
	pthread_t t_b;

	pthread_create(&t_a, NULL, thread1, NULL);
	pthread_create(&t_b, NULL, thread2, NULL);
	
	pthread_join(t_a, NULL);
	pthread_join(t_b, NULL);
	
	pthread_mutex_destroy(&mutex);
	pthread_cond_destroy(&cond);

	return 0;
}

void* thread1(void *) {
	for(i = 1; i<= 6; ++i) {
		printf("%d\n", i);
		pthread_mutex_lock(&mutex); // 上锁
		printf("thread1: lock %d\n", __LINE__);
		if(i % 3 == 0) {
			printf("thread1: signal 1 %d\n", __LINE__);
			pthread_cond_signal(&cond); // 设置条件变量okay
			printf("thread1: signal 2 %d\n", __LINE__);
			sleep(1);
		}
		pthread_mutex_unlock(&mutex); // 此处解锁, 线程2可以使用公共资源
		printf("thread1: unlock %d\n\n", __LINE__); 
		sleep(1); // 为了让线程2先强占到
	}
}

void* thread2(void*) {
	while(i < 6) {
		pthread_mutex_lock(&mutex); // 上锁
		printf("thread2: lock %d\n", __LINE__);
		if(i % 3 != 0) { 
			printf("thread2: wait 1 %d \n", __LINE__);
			pthread_cond_wait(&cond, &mutex); // 条件不满足, 释放锁, 等待=0的时候
			printf("thread2: wait 2 %d \n", __LINE__);
		}
		pthread_mutex_unlock(&mutex); // 解锁
		printf("thread 2: unlock %d \n\n", __LINE__); // 解锁
		sleep(1);// 为了让线程1抢到资源
	}
}


</span>

 

运行结果如下:

eric@eric-Inspiron-N3010:~/LearningLinux$ vim test04.cpp
eric@eric-Inspiron-N3010:~/LearningLinux$ g++ -o test04 test04.cpp -pthread
eric@eric-Inspiron-N3010:~/LearningLinux$ ./test04

注意, 上面开始运行的时候让线程2先抢到了资源, 但是无法运行, 只能等待条件变量满足。 所以下一句就释放了资源。 注意谁第一个先抢到有操作系统分配调度。 这是一个不确定的事情。 

一个注意, 编译的时候使用g++ -o test04 test04.cpp -pthread 而不是使用g++ -o test04 test04.cpp -lpthread, 因为这是最新支持的标准。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值