互斥锁和条件变量
2015-04-02 12:37
225 查看
多线程同步机制需要两个基本的机制, 即互斥锁和条件变量。 互斥锁防止多个线程并发的访问共享数据区, 保证每一次只有一个线程对共享数据区的数据进行操作。 虽然互斥锁能使得资源互斥的访问, 但是互斥锁并不是万能的。 因为互斥锁容易造成资源的浪费。 比如说线程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, 因为这是最新支持的标准。
相关文章推荐
- 线程互斥与同步(part2)—互斥锁(Mutex)的“cp”:条件变量(Condition Variable)
- 互斥锁和条件变量
- 再谈互斥锁与条件变量
- node源码详解(七) —— 文件异步io、线程池【互斥锁、条件变量、管道、事件对象】
- 嵌入式 Linux C 多线程编程 互斥锁与条件变量
- 互斥锁与条件变量配合使用
- 嵌入式 互斥锁和条件变量基础常识
- Linux C 多线程编程----互斥锁与条件变量-转
- 利用条件变量和互斥锁实现读写锁
- 线程同步:何时互斥锁不够,还需要条件变量?
- Posix多线程编程(1) 互斥锁与条件变量
- 线程同步:何时互斥锁不够,还需要条件变量?
- pthread_cond_wait理解以及互斥锁与条件变量使用的总结
- 同步(一)互斥锁与条件变量
- 关于条件变量和互斥锁为何配合使用的思考
- Linux C 多线程编程之互斥锁与条件变量
- 【Linux C 多线程编程】互斥锁与条件变量
- 【转】再谈互斥锁与条件变量!(终于搞清楚了啊!!!!!)
- 互斥锁和条件变量
- 互斥锁与条件变量及生产者-消费者问题