C++:使用互斥锁和条件变量控制线程执行顺序
C++: Control order of thread execution with mutex's and conditional variables
这个问题是这个问题的后续问题。我希望线程执行一些工作,并按顺序传递句柄给下一个线程。当尝试执行以下代码时,我得到
ConsoleApplication9.exe中0x0F7C1F5F (msvcp120 .dll)的未处理异常:0xC0000005:访问违反读取位置0x00000004.
#include "stdafx.h"
#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>
#include <condition_variable>
std::mutex* m_pMutexs;
std::condition_variable* m_pCVs;
int m_pCurrentWorker;
void func(int i)
{
int cvCurrentInd = i;
std::mutex* pCurMutex = &m_pMutexs[cvCurrentInd];
std::condition_variable* pCuCV = (std::condition_variable*)(m_pCurrentWorker + i*sizeof(std::condition_variable));
std::unique_lock<std::mutex> lk(m_pMutexs[i]);
while (i != m_pCurrentWorker)
{
pCuCV->wait(lk);
}
std::cout << "entered thread " << std::this_thread::get_id() << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(rand() % 10));
std::cout << "leaving thread " << std::this_thread::get_id() << std::endl;
m_pCurrentWorker++;
lk.unlock();
pCuCV->notify_one();
}
int _tmain(int argc, _TCHAR* argv[])
{
m_pMutexs = new std::mutex[3];
m_pCVs = new std::condition_variable[3];
m_pCurrentWorker = 0;
srand((unsigned int)time(0));
std::thread t1(func,0);
std::thread t2(func,1);
std::thread t3(func,2);
t1.join();
t2.join();
t3.join();
return 0;
}
不知道你在做什么,但是
你要将整型转换为指针?
std::condition_variable* pCuCV = (std::condition_variable*)(m_pCurrentWorker + i*sizeof(std::condition_variable));
我认为你应该这样写:
std::condition_variable* pCuCV = &m_pCVs[i];
整个函数可以是这样的:
void func(int i)
{
std::mutex* pCurMutex = &m_pMutexs[i];
std::condition_variable* pCuCV = &m_pCVs[i];
std::unique_lock<std::mutex> lk(m_pMutexs[i]);
while (i != m_pCurrentWorker) {
pCuCV->wait(lk);
}
std::cout << "entered thread " << std::this_thread::get_id() << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(rand() % 2));
std::cout << "leaving thread " << std::this_thread::get_id() << std::endl;
m_pCurrentWorker++;
lk.unlock();
if (m_pCurrentWorker > 2) {
return;
}
pCuCV = &m_pCVs[m_pCurrentWorker];
pCuCV->notify_one();
}
我做了一些进一步的研究,似乎原始问题的代码不是线程安全的
相关文章:
- 在 c++ 中基于范围的 for 循环中使用引用作为控制变量
- 需要帮助定义循环控制变量(while loops)C++
- 代码样式:在 switch/if 语句的分支中重用控件表达式或控制变量
- 控制通过类中的成员函数更改成员变量的能力C++
- 访问lambda内部循环控制变量
- C 是循环控制变量,并且在循环中相同
- 是否有任何类型特征控制成员类型(不是成员变量)
- 如何用python中的变量控制循环的增量
- 我可以控制调试器窗口中显示的浮点数和双精度变量的位数吗?
- 通过自己的条件变量 c++ 控制每个线程
- 控制C++中的实例化和成员变量
- 变量定义在 C++ 的控制结构中做什么
- 在控制结构块中定义变量
- 按字符控制变量
- 如何防止g++优化由IRQ可以更改的变量控制的循环
- 在工作线程完成MFC时禁用控制变量
- 控制C++AMP中的索引变量
- 控制未初始化堆栈变量的填充值(例如0xCC)
- 模板:如何使用模板变量控制构造函数参数的数量
- 定义控制结构中的变量