c++11 并发 条件变量 超时等待的代码练习

时间:2025-05-11 18:06:13

资料地址

http://en.cppreference.com/w/cpp/thread/condition_variable/wait_until

http://www.cnblogs.com/haippy/p/3252041.html

 // asdasdwa.cpp: 定义控制台应用程序的入口点。
// #include "stdafx.h" #include <mutex> // std::mutex, std::unique_lock
#include <iostream>
#include <string>
#include <atomic>
#include <condition_variable>
#include <thread>
#include <chrono>
#include <vector> #include <windows.h>
using namespace std::chrono_literals; /*
作 者: itdef 欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
技术交流群 群号码:324164944
欢迎c c++ windows驱动爱好者 服务器程序员沟通交流
部分老代码存放地点 http://www.oschina.net/code/list_by_user?id=614253
*/ std::condition_variable cv;
std::mutex mtx;
std::vector<std::string> messageVec; std::atomic<int> i; void SingalFunc() {
std::lock_guard<std::mutex> lock(mtx);
messageVec.push_back("1234567890test.hello world!");
std::cout << "push" << std::endl;
cv.notify_one();
} void WaitTimeOutFunc1()
{
while()
{
std::unique_lock<std::mutex> lck(mtx);
auto now = std::chrono::system_clock::now();
if (cv.wait_until(lck, now + 2s, []() {return !messageVec.empty(); })) {
std::cerr << "Thread " << " finished waiting. " << std::endl;
messageVec.pop_back();
}
else {
std::cerr << "Thread " << " timed out." << std::endl;
return;
}
}
} void WaitTimeOutFunc()
{
while()
{
std::unique_lock<std::mutex> lck(mtx);
std::cv_status status = std::cv_status::timeout;
auto now = std::chrono::system_clock::now();
while (messageVec.empty()) {
status = cv.wait_until(lck, now + 1s);
if (status == std::cv_status::timeout) {
std::cout << i << " timeout" << std::endl;
return;
}
} i.fetch_add();
std::cout << i << " no_timeout" << std::endl;
// std::cout << messageVec.back() << std::endl;
messageVec.pop_back();
}
return;
} int main()
{
std::thread t[];
for (int i = ; i < ; i++) {
SingalFunc();
}
for (int i = ; i <; i++) {
t[i] = std::thread(WaitTimeOutFunc);
} //for (int i = 0; i < 5000; i++) {
// SingalFunc();
//} for (int i = ; i < ; i++) {
t[i].join();
} return ;
}