T.T*_*.T. 9 c c++ windows resources winapi
对于多线程程序,我想做类似下面的事情:
// wait for variable to become true but don't hog resources
// then re-sync queues
Run Code Online (Sandbox Code Playgroud)
就是这样的一个很好的解决方案?
while (!ready) {
Thread.Sleep(250); // pause for 1/4 second;
};
Run Code Online (Sandbox Code Playgroud)
尝试使用事件(内核对象)而不是简单变量,并将循环替换为:
WaitForSingleObject(hEventHandle, INFINITE);
Run Code Online (Sandbox Code Playgroud)
以下是使用boost执行此操作的方法:
boost::condition_variable condvar;
boost::mutex mutex;
bool finished1 = false;
bool finished2 = false;
void longComputation1()
{
{
boost::lock_guard<boost::mutex> lock(mutex);
finished1 = false;
}
// Perform long computation
{
boost::lock_guard<boost::mutex> lock(mutex);
finished1 = true;
}
condvar.notify_one();
}
void longComputation2()
{
{
boost::lock_guard<boost::mutex> lock(mutex);
finished2 = false;
}
// Perform long computation
{
boost::lock_guard<boost::mutex> lock(mutex);
finished2 = true;
}
condvar.notify_one();
}
void somefunction()
{
// Wait for long computations to finish without "spinning"
boost::lock_guard<boost::mutex> lock(mutex);
while(!finished1 && !finished2)
{
condvar.wait(lock);
}
// Computations are finished
}
Run Code Online (Sandbox Code Playgroud)
为简洁起见,我没有包含线程产生代码.
在boost::lock_guard使用RAII成语当锁定对象超出范围自动解锁互斥.对于在异常情况下防止死锁非常有用.
我发现条件变量比Microsoft的Event对象更不容易出错.如果您使用boost.Thread,您将获得跨平台可维护性的额外好处.
| 归档时间: |
|
| 查看次数: |
8860 次 |
| 最近记录: |