原子操作C++

aki*_*kif 4 c++ windows multithreading

在C++,Windows平台中,我想以原子的形式执行一组函数调用,以便执行不会切换到我的进程中的其他线程.我该怎么做呢?任何想法,提示?

编辑:我有一段代码,如:

someObject->Restart();

WaitForSingleObject(handle, INFINITE);
Run Code Online (Sandbox Code Playgroud)

现在,Restart()函数以异步方式工作,因此它会快速返回,当someObject重新启动时,它会从另一个线程向我发送一个事件,我在其中发信号通知我正在等待的事件句柄,从而继续处理.但现在的问题是,在代码到达WaitForSingleObject()部分之前,我接收到重启完成事件并且我发出信号,之后WaitForSingleObject()永远不会返回,因为它没有再次发出信号.这就是为什么我想将Restart()WaitForSingleObject()作为原子执行.

sho*_*osh 9

这通常是不可能的.您无法强制操作系统切换到其他线程.
您可以做的是以下之一:

  • 使用锁,互斥锁,关键字部分或信号量来同步少数接触相同数据的线程.
  • 使用原子的基本操作,例如比较和交换或原子添加,以win32 api调用的形式,如InterlockedIncrement()InterlockedCompareExchange()


Mic*_*sen 7

您不希望所有线程都等待,您只想等待新线程完成,而不存在丢失信号的风险.这可以使用信号量来完成.

使用CreateSemaphore(NULL,0,1,NULL)创建此代码和最终由Restart执行的代码已知的信号量.在你展示的代码中,你仍然会使用WaitforSingleObject来等待你的信号量.当执行Release代码的线程完成它的工作时,让它调用ReleaseSemaphore.

如果首先调用ReleaseSemaphore,WaitforSingleObject将允许您立即传递.如果首先调用WaitforSingleObject,它将等待ReleaseSemaphore.

MSDN也应该帮助你.