我正在编写一个程序,我需要确保调用的特定函数一次不会在多个线程中执行。
在这里,我编写了一些简化的伪代码,它们完全可以在我的真实程序中完成。
mutex _enqueue_mutex;
mutex _action_mutex;
queue _queue;
bool _executing_queue;
// called in multiple threads, possibly simultaneously
do_action() {
_enqueue_mutex.lock()
object o;
_queue.enqueue(o);
_enqueue_mutex.unlock();
execute_queue();
}
execute_queue() {
if (!executing_queue) {
_executing_queue = true;
enqueue_mutex.lock();
bool is_empty = _queue.isEmpty();
_enqueue_mutex.lock();
while (!is_empty) {
_action_mutex.lock();
_enqueue_mutex.lock();
object o = _queue.dequeue();
is_empty = _queue.isEmpty();
_enqueue_mutex.unlock();
// callback is called when "o" is done being used by "do_stuff_to_object_with_callback" also, this function doesn't block, it is executed on its own thread (hence the need for the callback to know when it's done)
do_stuff_to_object_with_callback(o, &some_callback);
}
_executing_queue = false;
}
}
some_callback() {
_action_mutex.unlock();
}
本质上,这个想法是_action_mutex
锁定在 while 循环中(我应该说它lock
被假定为阻塞,直到它可以再次被锁定),并且在调用完成回调时期望被解锁(some_callback
在上面的代码中)。
这似乎不起作用。如果do_action
同时调用不止一次,程序就会锁定。我认为这可能与同时执行不止一次的 while 循环有关,但我只是看不出这是怎么回事。我的方法有问题吗?有更好的方法吗?
谢谢