C++ 确定代码是否在特定线程中运行

C++ 确定代码是否在特定线程中运行,c++,multithreading,c++11,concurrency,stl,C++,Multithreading,C++11,Concurrency,Stl,在我的应用程序中,我使用以下代码段运行后台操作: m_thread = std::thread(&MyClass::BackOp, this); 有时,我的应用程序调用函数Close()中的不同线程(可能包括m_-thread本身)等待后台线程完成其操作: if(m_thread.joinable()) m_thread.join(); 这是不安全的行为,如果我是对的,它可能会导致僵局 我是否可以在我的Close()函数文本中确定它是否正在后台线程中运行,以跳过“加入” 谢谢大家!

在我的应用程序中,我使用以下代码段运行后台操作:

m_thread = std::thread(&MyClass::BackOp, this);
有时,我的应用程序调用函数
Close()
中的不同线程(可能包括
m_-thread
本身)等待后台线程完成其操作:

if(m_thread.joinable()) m_thread.join();
这是不安全的行为,如果我是对的,它可能会导致僵局

我是否可以在我的
Close()
函数文本中确定它是否正在后台线程中运行,以跳过“加入”

谢谢大家!

我相信您希望使用它并将其结果与(您的“背景”线程的)结果进行比较。或者有一些线程局部变量(可能在线程开始时存储这些变量,等等)

我是否可以在我的
Close()
函数中确定它是否正在后台线程中运行,以跳过“加入”


是的,您可以使用该函数并与
m_thread.get_id()
进行比较,以确定例程是否在同一
std::thread
实例中运行。

您应该使用
if(m_thread.joinable())m_thread.join()。从未听说过它是不安全的。

如果在
m_-thread
上下文中调用
Close()
该怎么办?它将自己加入,这应该是解除锁定?@Joker根据标准,30.3.1.5线程成员,
join
要求线程是“可加入”的,并且当
this->get_id()==std::this_thread::get_id()
-将抛出一个异常,这意味着
资源\u死锁\u将发生时,
正确,由于堆缓存的原因,跨多个线程共享变量是不安全的。为什么不使用同步原语,比如可以定义某种“关键部分”的互斥体呢?首先,在我的nanospeed例程中,关键部分/互斥体非常慢。其次,在这个问题中我不需要它,在我的函数
Close()
中,我只等待线程完成。可能,这可以从我的应用程序中的任何线程执行,包括
m_-thread
本身。请注意:
if(m_-thread.joinable())m_-thread.join()m\u thread.joinable()
之后,但在执行
m\u thread.join()
之前,
m\u thread
完成执行并由第三个线程连接,则code>可能会导致类型为
std::system\u error
和code
invalid\u参数的异常。还要注意的是,对
std::thread
对象的操作是不同步的,因此不同线程访问同一
m_thread
的整个过程具有内在的风险。@bogdan因此没有任何解决方案可以在不使用
try..catch
的情况下安全地调用
join()
。?即使捕获异常,您的代码没有任何保证。如果不知道在存在多个线程的情况下对
Close()
的语义有什么确切要求,就很难给出解决方案(这是一个单独的问题)。如果您真的希望多个线程同时等待后台线程完成,那么您需要一个适当的同步机制来可靠地完成这项工作—例如,a或a。您为什么认为如果在当前执行线程上调用
joinable()
将不会返回true?@Joker
m_thread.join()m_thread
是当前执行线程,则code>将引发异常-如果线程已完成执行,则会发生带有代码
资源的
std::system_error
死锁,因此不会出现死锁。@bogdan如果线程已完成执行,该例程如何从线程内部执行,要使其返回
true
?@πάνταῥεῖ
m_线程
操作本身是一个长期的过程,它可能会决定使用我问题中描述的shared
Close()
函数停止自身。这是很平常的事。或者你不懂线程?@Joker抱歉,我错认为
joinable()
。将从答案中删除该选项。