Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 防止两次启动线程_C++_Multithreading_Boost Thread - Fatal编程技术网

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 For
t2
也可以使用锁acquired@Kerrek对于
t2
也可以获取锁这可能是一个解决方案,但我试图找到一种不增加、减少和检查的方法。因为有时候人们可能会忘记这样做:)@Benjamin:它比互斥锁更有效,互斥锁也应该被锁定和解锁。这可能是一个解决方案,但我试图找到一种不增加、减少和检查的方法。因为有时候人们可能会忘记这样做:)@Benjamin:它比互斥更有效,什么东西也应该被锁定和解锁。