我怎样才能安全地使用 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);
}