【发布时间】:2011-08-13 19:08:27
【问题描述】:
我知道,当我对多个线程内的单个 STL 容器执行操作时,我需要使用互斥锁。但是我想知道这条规则是否有任何例外。请考虑我正在尝试实施的简化方案。
我有多个线程向容器添加元素,并且操作被互斥锁/解锁包围。然后线程以某种方式通知(例如,在 linux 上使用 eventfd)单个线程专用于调度此容器中的元素。我想要做的是在不使用互斥锁的情况下访问容器中的第一个元素。基于 deque 的示例代码,但请注意,我可以使用任何具有队列功能的容器:
std::mutex locker;
std:deque<int> int_queue;
int fd; // eventfd
eventfd_t buffer;
bool some_condition;
线程 1、2、3 等
locker.lock ();
int_queue.push_back (1);
locker.unlock ();
eventfd_write (fd, 1);
专门用于调度元素的线程:
while (true)
{
bool some_condition (true);
locker.lock ();
if (int_quque.empty () == false)
{
locker.unlock ();
}
else
{
locker.unlock ();
eventfd_read (fd, &buffer);
}
while (some_condition)
{
int& data (int_queue.front ());
some_condition = some_operation (data); // [1]
}
locker.lock ();
int_queue.pop ();
locker.unlock ();
}
[1] 我会多次对signle 元素执行 some_operation(),这就是为什么我想在这里避免互斥锁。太贵了。
我想知道这段代码是否会导致任何同步问题或其他问题。
【问题讨论】:
-
没有
stl::mutex或stl:deque-- 你指的是什么编译器/库/标准? -
没有捷径,这里需要加锁。
-
请不要这样做
if ( condition == false ),这只会损害可读性。