目标:主线程向其它线程发生消息,其它线程收到消息并处理。
伪代码目标:主线程将消息加入listTemp链表,使用condition_variable的notify_one通知线程,其它线程将消息处理,并将消息加入到已处理listTemp2链表中。
伪代码
#include <atomic>
#include <mutex>
#include <list>
#include <vector>
#include <thread>
#include <cassert>
int main()
{
std::atomic<int> nNum = ATOMIC_VAR_INIT(0);
std::mutex listMu;
std::list<int> listTemp;
std::mutex listMu2;
std::list<int> listTemp2;
std::condition_variable listCondition;
std::vector<std::shared_ptr < std::thread >> listThread;
int const nMax = 1000;
for (int i = 0; i != 10; ++i)
{
auto pTh = std::make_shared <std::thread>([&listTemp,&listCondition,&listMu,&nNum,&listTemp2,&listMu2,nMax]
()->void
{
while (true)
{
int i = -1;
{
std::unique_lock<std::mutex> lc(listMu);
while (listTemp.empty())
{
listCondition.wait(lc);
{
std::lock_guard<std::mutex> lc(listMu2);
if (listTemp2.size() == nMax)
{
break;
}
}
}
{
std::lock_guard<std::mutex> lc(listMu2);
if (listTemp2.size() == nMax)
{
listCondition.notify_one();
break;
}
}
i = *listTemp.begin();
listTemp.erase(listTemp.begin());
}
//处理比较耗时的操作
{
std::lock_guard<std::mutex> lc(listMu2);
listTemp2.push_back(i);
if (listTemp2.size() == nMax)
{
listCondition.notify_one();
break;
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
});
listThread.push_back(pTh);
}
for (int i = 0; i != nMax; ++i)
{
{
std::lock_guard<std::mutex> lc(listMu);
listTemp.push_back(i);
listCondition.notify_one();
}
std::this_thread::sleep_for(std::chrono::milliseconds(15));
}
//listCondition.notify_all();
for (auto t : listThread)
{
t->join();
}
assert(nMax == listTemp2);
std::cout << "结束" << std::endl;
getchar();
return 0;
}
代码保证消息不会有遗漏,并且所有消息都能得到处理。但是并不保证,已处理的消息链表中的顺序与加入消息的顺序一致。