C++ 线程没有被分离

C++ 线程没有被分离,c++,multithreading,c++11,C++,Multithreading,C++11,我正在尝试创建一个线程池。我有一个std::unordered_映射,它将线程ID映射到std::threads(workers)。线程ID是等待将任务推入线程池的线程的ID(waiters)。任务由std::stack(tasks)表示。一旦任务被推送到池中,任务就会从堆栈中弹出,并作为映射的“值”部分放入线程函数中 在析构函数中,我尝试分离仍在运行的所有线程。但我仍然得到以下例外: 在没有活动异常的情况下终止调用 bash:7行:16881中止(内核转储)。/a.out 这意味着线程没有分

我正在尝试创建一个线程池。我有一个
std::unordered_映射
,它将线程ID映射到
std::thread
s(
workers
)。线程ID是等待将任务推入线程池的线程的ID(
waiters
)。任务由
std::stack
tasks
)表示。一旦任务被推送到池中,任务就会从堆栈中弹出,并作为映射的“值”部分放入线程函数中

在析构函数中,我尝试分离仍在运行的所有线程。但我仍然得到以下例外:

在没有活动异常的情况下终止调用
bash:7行:16881中止(内核转储)。/a.out
这意味着线程没有分离,程序终止。但是我的析构函数遍历元素并分离它们(我相信)。为什么会发生这种情况?我如何修复它

#包括
#包括
#包括
#包括

#在池析构函数中包含

,在分离线程之前调用
pop,有效地破坏了可连接的线程:标准保证这将调用

首先分离线程,然后将其从队列中弹出:

while (!waiters.empty())
{
    auto& t = waiters.front();

    if (t.joinable())
        t.detach();

    waiters.pop();
}

我同意quantdev的回答,但我真的很好奇这是为了实现什么,一个简单的
std::thread
向量、一个队列和一个传统的先通知退出再加入的方法解决不了这个问题。你显然比我们更了解你的需求,但简单通常是。。好。。更简单。有趣的模型,尽管如此。@WhozCraig我很难使用线程向量。线程首先应该等待一个任务进入队列,然后如何将一个线程从等待的线程转换为执行该任务的线程?另外,NotifytoExit然后join方法是如何工作的?很难在注释中建模。如果我在接下来的一两天里有机会,我会看看我是否能把一个简单的模型拼凑在一起,但是稍微搜索一下pthread、工作队列池和条件变量可能会得到我想要的结果。我很快瞥了一眼你的历史,毫无疑问你会很容易理解的。@WhozCraig谢谢,我会查这些东西的。顺便说一句,在C++11中,由于标准库的多线程支持,pthreads在很大程度上不是不需要的吗?我为什么要用这个?这确实是你应该用的。大多数非windows平台将在后台使用pthread。etc是如此紧密地建模的。理解pthread概念当然有帮助。