gpt4 book ai didi

c++ - 如何在其他线程等待时阻塞线程

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:28 26 4
gpt4 key购买 nike

我有一个非常具体的问题要解决。我很确定世界上其他人已经遇到并解决了它,但我还没有找到任何解决方案。

这里是:

  • 我有一个线程从队列中弹出命令并异步执行它们
  • 我可以从任何其他线程调用一个函数来同步执行命令,绕过队列机制,返回一个结果,并优先执行(在当前执行结束后)。
  • 我有一个保护命令执行的互斥锁,所以一次只执行一个命令问题是,对于一个简单的互斥锁,我不确定同步调用是否会在冲突时先于异步线程获得互斥锁。事实上,我们的测试表明分配非常不公平,异步线程总是获胜。

所以我想在同步调用等待时阻塞异步线程。我事先不知道可以进行多少个同步调用,并且我不控制进行调用的线程(因此使用线程池的任何解决方案都是不可能的)。

我正在使用 C++ 和 Microsoft 库。我知道基本的同步对象,但也许有更高级的对象或方法适合我的问题但我不知道。

我愿意接受任何想法!

最佳答案

好的,我终于有机会结束这个了。我尝试了此处和发布的链接中提出的一些解决方案。最后,我结合了一个用于命令执行的互斥量和一个等待同步调用的计数器(当然,该计数器也受互斥量保护)。异步线程在尝试获取互斥量之前检查计数器,并等待计数器为 0。另外,为了避免 sleep 循环,我添加了一个在计数器设置为 0 时设置的事件。异步线程等待在尝试获取互斥量之前发生此事件。

void incrementSyncCounter()
{
DLGuardThread guard(_counterMutex);
_synchCount++;
}

void decrementSyncCounter()
{
DLGuardThread guard(_counterMutex);
_synchCount--;

// If the counter is 0, it means that no other sync call is waiting, so we notify the main thread by setting the event
if(_synchCount == 0)
{
_counterEvent.set();
}
}

unsigned long getSyncCounter()
{
DLGuardThread guard(_counterMutex);
return _synchCount;
}

bool executeCommand(Command* command)
{
// Increment the sync call counter so the main thread can be locked while at least one sync call is waiting
incrementSyncCounter();

// Execute the command using mutex protection
DLGuardThread guard(_theCommandMutex);
bool res = command->execute();
guard.release();

// Decrement the sync call counter so the main thread can be unlocked if there is no sync call waiting
decrementSyncCounter();

return res;
}

void main ()
{
[...]
// Infinite loop
while(!_bStop)
{
// While the Synchronous call counter is not 0, this main thread is locked to give priority to the sync calls.
// _counterEvent will be set when the counter is decremented to 0, then this thread will check the value once again to be sure no other call has arrived inbetween.
while(getSyncCounter() > 0)
{
::WaitForSingleObject (_counterEvent.hEvent(), INFINITE);
}

// Take mutex
DLGuardThread guard(_theCommandMutex);

status = command->execute();

// Release mutex
guard.release();
}
}

关于c++ - 如何在其他线程等待时阻塞线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54072600/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com