c++中带有std::Vector的多线程
MultiThreading with std::Vector in C++
我想创建两个并发访问vector的线程,这样一个线程每隔10毫秒将元素推到vector的后面,另一个线程只是监视vector,看看它的大小是否发生了变化。在这里,我得到错误"解锁无主互斥锁",你能告诉我为什么吗?
class SafeVec
{
public:
SafeVec(){}
~SafeVec(){}
void safePushBack(int val)
{
vecMutex.lock();
vec.push_back(val);
vecMutex.unlock();
}
size_t safeGetSize()
{
vecMutex.lock();
size_t size = vec.size();
vecMutex.unlock();
return size;
}
private:
std::vector<int> vec;
std::mutex vecMutex;
};
class safeStream
{
public:
safeStream(){}
~safeStream(){}
void Test()
{
std::thread t(&safeStream::tMonitorVec, this); // spawned a new thread
for (size_t i = 0; i < 100; i++)
{
myVec.safePushBack(1);
Sleep(10);
}
stopMonitoringMutex.lock();
stopMonitoring = true;
stopMonitoringMutex.unlock();
}
private:
void tMonitorVec()
{
stopMonitoring = false;
size_t tempSize = myVec.safeGetSize();
int count = 0;
stopMonitoringMutex.lock();
while (1)
{
if (stopMonitoring)
{
stopMonitoringMutex.unlock();
break;
}
else
{
stopMonitoringMutex.unlock();
if (tempSize != myVec.safeGetSize())
{
count++;
}
}
}
std::cout << count;
}
SafeVec myVec;
bool stopMonitoring;
std::mutex stopMonitoringMutex;
};
int main()
{
safeStream myStream;
myStream.Test();
return 0;
}
这发生在你的循环中:
while (1)
{
if (stopMonitoring)
{
stopMonitoringMutex.unlock();
break;
}
else
{
// Whoops! I am here again !
stopMonitoringMutex.unlock();
if (tempSize != myVec.safeGetSize())
{
count++;
}
}
}
还有一件事要考虑:如果您使用std::mutex
只是为了保护对字段bool stopMonitoring;
的并发访问,请使用std::atomic<bool> stopMonitoring;
来代替,并忘记互斥。
相关文章:
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 使用 vector<thread> 和 .join() 未并行运行的多线程C++程序
- QList、QVector或std::vector多线程使用
- 可以用C++std::vector同时处理来自多线程的push_back
- std::vector::erase() (多线程) '断言 'px != 0' 失败。
- c++中带有std::Vector的多线程
- c++使用' .reserve() '填充' std::vector '作为防止多线程缓存无效和错误共享的一种方
- 在多线程C++程序中使用std::vector时导致应用程序崩溃
- 多线程程序,它将线程保存在vector而不是数组中
- 多线程安全地插入vector的最快方法是什么?
- vector多线程同步,一个读一个写:只在调整大小时锁定