三个线程循环打印abc

方法一:使用一个条件变量进行同步

使用C++11的标准方法一:线程语法,用一个全局变量state控制条件变量的wait()阻塞等待时机,用notify_all()唤醒条件变量。

具体的代码如下,3个线程分别打印ABC,循环10次:

#include 
#include 
#include 
#include 
using namespace std;

int state = 0;           //全局变量
mutex m;                 //全局变量
condition_variable cv;   //全局变量

void func1() {
	unique_lock lk(m);
	for (int i = 0; i < 10; i++) {
		while (state != 0)
			cv.wait(lk);
		cout << "a";
		state++;
		i++;
		cv.notify_all();
	}
}
void func2() {
	unique_lock lk(m);
	for (int i = 0; i < 10; i++) {
		while (state != 1)
			cv.wait(lk);
		cout << "b";
		state++;
		i++;
		cv.notify_all();
	}
}
void func3() {
	unique_lock lk(m);
	for (int i = 0; i < 10; i++) {
		while (state != 2)
			cv.wait(lk);
		cout << "c";
		state=0;
		i++;
		cv.notify_all();
	}
}

int main() {
	thread t1(func1);
	thread t2(func2);
	thread t3(func3);
	t1.join();
	t2.join();
	t3.join();

	return 0;
}

方法二:使用pthread库三个信号量进行同步(信号量可以用互斥锁和条件变量组合实现)

#include
#include
#include
#include
 
sem_t sem_id1, sem_id2, sem_id3;
 
void* func1(void*);    
void* func2(void*);
void* func3(void*);
 
int main(void) {
    sem_init(&sem_id1, 0, 1);   //初始为1,从它所在线程开始打印   
    sem_init(&sem_id2, 0, 0);
    sem_init(&sem_id3, 0, 0);
 
    pthread_t pthread_id1, pthread_id2, pthread_id3;
    pthread_create(&pthread_id1, NULL, func1, NULL);
    pthread_create(&pthread_id2, NULL, func2, NULL);
    pthread_create(&pthread_id3, NULL, func3, NULL);
 
    pthread_join(phread_id1, NULL);
    pthread_join(phread_id1, NULL);
    pthread_join(phread_id1, NULL);
 
    return 0;
}
 
void *func1 (void*) {
    sem_wait(sem_id1);
    printf("a");
    sem_post(sem_id2);
}
void *func2 (void*) {
    sem_wait(sem_id2);
    printf("b");
    sem_post(sem_id3);
}
void *func3 (void*) {
    sem_wait(sem_id3);
    printf("c");
    sem_post(sem_id1);
}

 

你可能感兴趣的:(笔面试)