我怎样才能安全地使用 std::vector 和互斥量?
How can I use std::vector safely with mutex?
我用多线程读写一个全局变量std::deque<int> g_to_be_downloaded_tasks
,我用std::mutex
保护并发访问。但是在 ThreadA 向这个 vector 中插入一个元素后,ThreadB 无法获取元素,
线程A
g_to_be_downloaded_tasks_mutex.try_lock();
g_to_be_downloaded_tasks.push_back(temp);
g_to_be_downloaded_tasks_mutex.unlock();
ThreadB:ThreadB 在使用 g_to_be_downloaded_tasks.size()
后得到 0
g_to_be_downloaded_tasks_mutex.try_lock();
if(g_to_be_downloaded_tasks.size() > 0)
{
curr_task = g_to_be_downloaded_tasks.front();
}
g_to_be_downloaded_tasks_mutex.unlock();
为什么 g_to_be_downloaded_tasks.size()
returns 0 ?
您忽略了 try_lock
的结果,因此您没有有意义地使用互斥锁。由于数据争用,您的代码具有未定义的行为。
如果您不想阻止,请使用 try_lock
的结果
if (g_to_be_downloaded_tasks_mutex.try_lock()) {
g_to_be_downloaded_tasks.push_back(temp);
g_to_be_downloaded_tasks_mutex.unlock();
}
if(g_to_be_downloaded_tasks_mutex.try_lock() && (g_to_be_downloaded_tasks.size() > 0))
{
curr_task = g_to_be_downloaded_tasks.front();
g_to_be_downloaded_tasks_mutex.unlock();
}
更常见的是,生产端会等待锁,否则就是丢弃工作
{
std::lock_guard guard(g_to_be_downloaded_tasks_mutex);
g_to_be_downloaded_tasks.push_back(temp);
}
我用多线程读写一个全局变量std::deque<int> g_to_be_downloaded_tasks
,我用std::mutex
保护并发访问。但是在 ThreadA 向这个 vector 中插入一个元素后,ThreadB 无法获取元素,
线程A
g_to_be_downloaded_tasks_mutex.try_lock();
g_to_be_downloaded_tasks.push_back(temp);
g_to_be_downloaded_tasks_mutex.unlock();
ThreadB:ThreadB 在使用 g_to_be_downloaded_tasks.size()
g_to_be_downloaded_tasks_mutex.try_lock();
if(g_to_be_downloaded_tasks.size() > 0)
{
curr_task = g_to_be_downloaded_tasks.front();
}
g_to_be_downloaded_tasks_mutex.unlock();
为什么 g_to_be_downloaded_tasks.size()
returns 0 ?
您忽略了 try_lock
的结果,因此您没有有意义地使用互斥锁。由于数据争用,您的代码具有未定义的行为。
如果您不想阻止,请使用 try_lock
if (g_to_be_downloaded_tasks_mutex.try_lock()) {
g_to_be_downloaded_tasks.push_back(temp);
g_to_be_downloaded_tasks_mutex.unlock();
}
if(g_to_be_downloaded_tasks_mutex.try_lock() && (g_to_be_downloaded_tasks.size() > 0))
{
curr_task = g_to_be_downloaded_tasks.front();
g_to_be_downloaded_tasks_mutex.unlock();
}
更常见的是,生产端会等待锁,否则就是丢弃工作
{
std::lock_guard guard(g_to_be_downloaded_tasks_mutex);
g_to_be_downloaded_tasks.push_back(temp);
}