您的位置:首页 > 编程语言 > C语言/C++

c++11中condition_variable信号量的标准用法。

2015-12-07 13:24 471 查看
目标:主线程向其它线程发生消息,其它线程收到消息并处理。

伪代码目标:主线程将消息加入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;
}


代码保证消息不会有遗漏,并且所有消息都能得到处理。但是并不保证,已处理的消息链表中的顺序与加入消息的顺序一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: