Linux系统——线程同步(条件变量)
Linux系统——线程同步(条件变量)
实现代码
#include<bits/stdc++.h>
#include<unistd.h>
#include<pthread.h>
using namespace std;pthread_cond_t condition = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;string buffer;void* consumer(void *p) {while (true) {pthread_mutex_lock(&mtx);pthread_cond_wait(&condition, &mtx);if (buffer == "finish") {break;}cout << "Consume " << buffer << endl;pthread_mutex_unlock(&mtx);}
}void* producer(void* p) {while (true) {string production;cin >> production;pthread_mutex_lock(&mtx);if (production != "finish") {cout << "Produced" << endl;}buffer = production;pthread_cond_signal(&condition);pthread_mutex_unlock(&mtx);if (production == "finish") {break;}}
}int main(int argc, char const *argv[]) {pthread_t consumerThreadId, producerThreadId;if (pthread_create(&consumerThreadId, NULL, consumer, NULL)) {printf("Thread create error!\n");abort();}if (pthread_create(&producerThreadId, NULL, producer, NULL)) {printf("Thread create error!\n");abort();}pthread_join(consumerThreadId, NULL);pthread_join(producerThreadId, NULL);return 0;
}
实现效果
- 主线程
创建子线程producer和子线程consumer - 子线程producer
从标准输入流中读入数据,存入全局共享变量buffer,调用pthread_cond_signal()唤醒子线程consumer,读取到"finish"结束 - 子线程consumer
等待条件变量成立而挂起,等待子线程producer发来的信号,条件成立后,读取buffer的内容,输出到标准输出流,继续循环等待下一个数据的输入,读取到"finish"结束
注意
- 编译方式
g++ -pthread -o PthreadConditionWait PthreadConditionWait.cpp
- 互斥变量
pthread_cond_wait()必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()的竞争条件
测试结果
pthread_cond_wait()
- 作用
一个线程等待"条件变量的条件成立"而挂起,等待另一线程唤醒
- 函数原型
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
- 参数
- 条件变量
- 互斥锁变量
pthread_cond_signal()
- 作用
一个线程发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态
- 函数原型
int pthread_cond_signal(pthread_cond_t *cond);
- 参数
- 条件变量
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
Linux系统——线程同步(条件变量)
Linux系统——线程同步(条件变量)
实现代码
#include<bits/stdc++.h>
#include<unistd.h>
#include<pthread.h>
using namespace std;pthread_cond_t condition = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;string buffer;void* consumer(void *p) {while (true) {pthread_mutex_lock(&mtx);pthread_cond_wait(&condition, &mtx);if (buffer == "finish") {break;}cout << "Consume " << buffer << endl;pthread_mutex_unlock(&mtx);}
}void* producer(void* p) {while (true) {string production;cin >> production;pthread_mutex_lock(&mtx);if (production != "finish") {cout << "Produced" << endl;}buffer = production;pthread_cond_signal(&condition);pthread_mutex_unlock(&mtx);if (production == "finish") {break;}}
}int main(int argc, char const *argv[]) {pthread_t consumerThreadId, producerThreadId;if (pthread_create(&consumerThreadId, NULL, consumer, NULL)) {printf("Thread create error!\n");abort();}if (pthread_create(&producerThreadId, NULL, producer, NULL)) {printf("Thread create error!\n");abort();}pthread_join(consumerThreadId, NULL);pthread_join(producerThreadId, NULL);return 0;
}
实现效果
- 主线程
创建子线程producer和子线程consumer - 子线程producer
从标准输入流中读入数据,存入全局共享变量buffer,调用pthread_cond_signal()唤醒子线程consumer,读取到"finish"结束 - 子线程consumer
等待条件变量成立而挂起,等待子线程producer发来的信号,条件成立后,读取buffer的内容,输出到标准输出流,继续循环等待下一个数据的输入,读取到"finish"结束
注意
- 编译方式
g++ -pthread -o PthreadConditionWait PthreadConditionWait.cpp
- 互斥变量
pthread_cond_wait()必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()的竞争条件
测试结果
pthread_cond_wait()
- 作用
一个线程等待"条件变量的条件成立"而挂起,等待另一线程唤醒
- 函数原型
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
- 参数
- 条件变量
- 互斥锁变量
pthread_cond_signal()
- 作用
一个线程发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态
- 函数原型
int pthread_cond_signal(pthread_cond_t *cond);
- 参数
- 条件变量
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
发布评论