Linux系统——线程同步(条件变量)

Linux系统——线程同步(条件变量)

实现代码

#include
#include
#include
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()的竞争条件

测试结果

Linux系统——线程同步(条件变量)_第1张图片

pthread_cond_wait()

  • 作用

一个线程等待"条件变量的条件成立"而挂起,等待另一线程唤醒

  • 函数原型
    int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex)
  • 参数
  1. 条件变量
  2. 互斥锁变量

pthread_cond_signal()

  • 作用

一个线程发送一个信号给另外一个正在处于阻塞等待状态的线程,使其脱离阻塞状态

  • 函数原型
    int pthread_cond_signal(pthread_cond_t *cond);
  • 参数
  1. 条件变量

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!

你可能感兴趣的:(Linux)