#include <thread>
#include <iostream>
#include <condition_variable>
#include <mutex>
#include <vector>
using namespace std;
mutex mtx;
condition_variable cond;
int counter = 0;
int order = 0;
// k -> 交替打印数组个数
// o -> 数组打印的次序
template<typename T>
void print(vector<T>& nums, int k, int o) {
int i = 0;
for (T num: nums) {
{
unique_lock<mutex> locker(mtx);
while (order%k!=o || k*i > counter) {
cond.wait(locker);
}
cout << num;
counter++;
order++;
}
i++;
cond.notify_all(); // 必须唤醒所有阻塞的线程
}
}
// 输出:123a456b789c101112d
int main () {
vector<int> v1{1,4,7,10};
vector<int> v2{2,5,8,11};
vector<int> v3{3,6,9,12};
vector<char> v4{'a','b','c','d'};
thread t1(print<int>, ref(v1), 4, 0);
thread t2(print<int>, ref(v2), 4, 1);
thread t3(print<int>, ref(v3), 4, 2);
thread t4(print<char>, ref(v4), 4, 3);
t1.join();
t2.join();
t3.join();
t4.join();
}