我想创建两个同时访问一个 vector 的线程,这样一个线程每 10 毫秒不断将元素推送到 vector 后面,另一个只是监视 vector 以查看其大小是否发生了变化。在这里,我收到错误“unlock of unowned mutex”,你能告诉我原因吗。
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++ - 在 C++ 中使用 std::Vector 进行多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25491013/