1、全局flag + 全局mutex
测试是否正确,可以在B线程取锁之前sleep一秒,发现确实是顺序打印
#include <iostream>
#include <thread>
#include <mutex>
std::mutex mut;
static int flag = 1;
static int sum = 0;
void f1() {
while (1) {
if (sum >= 100) {
break;
}
mut.lock();
if (flag == 1 && sum<100) {
flag = 2;
sum++;
std::cout << "Thread 1: A: " << sum << std::endl;
}
mut.unlock();
}
}
void f2() {
while (1) {
if (sum >= 100) {
break;
}
// sleep(1);
mut.lock();
if (flag == 2 && sum<100) {
flag = 3;
sum++;
std::cout << "Thread 2: B: " << sum << std::endl;
}
mut.unlock();
}
}
void f3() {
while (1) {
if (sum >= 100) {
break;
}
mut.lock();
if (flag == 3 && sum<100) {
flag = 1;
sum++;
std::cout << "Thread 3: C: " << sum << std::endl;
}
mut.unlock();
}
}
int main() {
std::thread thread1(f1);
std::thread thread2(f2);
std::thread thread3(f3);
thread1.join();
thread2.join();
thread3.join();
}
2 、条件变量
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <functional>
#include <unistd.h>
std::mutex mut;
std::condition_variable A;
std::condition_variable B;
std::condition_variable C;
static int sum = 0;
void f1() {
while (1) {
if (sum >= 100) {
B.notify_one();
break;
} else {
std::cout << "Thread 1: A: " << sum << std::endl;
sum++;
}
B.notify_one();
std::unique_lock <std::mutex> lck(mut);
A.wait(lck);
lck.unlock();
}
}
void f2() {
while (1) {
if (sum >= 100) {
C.notify_one();
break;
} else {
std::cout << "Thread 2: B: " << sum << std::endl;
sum++;
}
C.notify_one();
std::unique_lock <std::mutex> lck(mut);
B.wait(lck);
lck.unlock();
}
}
void f3() {
while (1) {
if (sum >= 100) {
A.notify_one();
break;
} else {
std::cout << "Thread 3: C: " << sum << std::endl;
sum++;
}
A.notify_one();
std::unique_lock <std::mutex> lck(mut);
C.wait(lck);
lck.unlock();
}
}
int main() {
std::thread thread1(f1);
sleep(1);
std::thread thread2(f2);
sleep(1);
std::thread thread3(f3);
thread1.join();
thread2.join();
thread3.join();
}