C++ 防止两次启动线程
假设你有一个小的计算方法,它是由一个线程开始的:C++ 防止两次启动线程,c++,multithreading,boost-thread,C++,Multithreading,Boost Thread,假设你有一个小的计算方法,它是由一个线程开始的: boost::mutex mMutex; void MyClass::DoSomething { boost::unique_lock<boost::mutex> tLock(mMutex); if(tLock.owns_lock() { // do some stuff... } } 如果t1正在运行,如何防止执行t2?我的unique\u lock似乎失败。创建一个变量,在启动t1线程之前,以原子方式增加该
boost::mutex mMutex;
void MyClass::DoSomething {
boost::unique_lock<boost::mutex> tLock(mMutex);
if(tLock.owns_lock() {
// do some stuff...
}
}
如果
t1
正在运行,如何防止执行t2
?我的unique\u lock
似乎失败。创建一个变量,在启动t1
线程之前,以原子方式增加该变量。完成后,以原子方式将该变量减少为null。在Foo
中,您只需检查此变量是否为空
创建一个变量,在启动
t1
线程之前,以原子方式增加该变量。完成后,以原子方式将该变量减少为null。在Foo
中,您只需检查此变量是否为空
根据Naszta的想法,这里有一种使用原子布尔和原子交换的可能方法:
std::atomic<bool> thread_in_use(False);
void DoSomething()
{
if (thread_in_use.exchange(true))
return;
// ...
thread_in_use = false;
}
std::原子线程正在使用(False);
无效剂量测定法()
{
if(线程使用交换(true))
返回;
// ...
正在使用的线程=false;
}
根据Naszta的想法,这里有一种使用原子布尔和原子交换的可能方法:
std::atomic<bool> thread_in_use(False);
void DoSomething()
{
if (thread_in_use.exchange(true))
return;
// ...
thread_in_use = false;
}
std::原子线程正在使用(False);
无效剂量测定法()
{
if(线程使用交换(true))
返回;
// ...
正在使用的线程=false;
}
@Kerrek Fort2
也可以使用锁acquired@Kerrek对于t2
也可以获取锁这可能是一个解决方案,但我试图找到一种不增加、减少和检查的方法。因为有时候人们可能会忘记这样做:)@Benjamin:它比互斥锁更有效,互斥锁也应该被锁定和解锁。这可能是一个解决方案,但我试图找到一种不增加、减少和检查的方法。因为有时候人们可能会忘记这样做:)@Benjamin:它比互斥更有效,什么东西也应该被锁定和解锁。