C++在没有活动异常的情况下终止调用
我在线程处理方面遇到 C++ 错误:
terminate called without an active exception
Aborted
这是代码:
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
template<typename TYPE>
class blocking_stream
{
public:
blocking_stream(size_t max_buffer_size_)
: max_buffer_size(max_buffer_size_)
{
}
//PUSH data into the buffer
blocking_stream &operator<<(TYPE &other)
{
std::unique_lock<std::mutex> mtx_lock(mtx);
while(buffer.size()>=max_buffer_size)
stop_if_full.wait(mtx_lock);
buffer.push(std::move(other));
mtx_lock.unlock();
stop_if_empty.notify_one();
return *this;
}
//POP data out of the buffer
blocking_stream &operator>>(TYPE &other)
{
std::unique_lock<std::mutex> mtx_lock(mtx);
while(buffer.empty())
stop_if_empty.wait(mtx_lock);
other.swap(buffer.front());
buffer.pop();
mtx_lock.unlock();
stop_if_full.notify_one();
return *this;
}
private:
size_t max_buffer_size;
std::queue<TYPE> buffer;
std::mutex mtx;
std::condition_variable stop_if_empty,
stop_if_full;
bool eof;
};
我围绕此示例对代码进行了建模: http://www.justsoftwaresolutions.co.uk/ threading/implementing-a-thread-safe-queue-using-condition-variables.html
我做错了什么以及如何修复错误?
I am getting a C++ error with threading:
terminate called without an active exception
Aborted
Here is the code:
#include <queue>
#include <thread>
#include <mutex>
#include <condition_variable>
template<typename TYPE>
class blocking_stream
{
public:
blocking_stream(size_t max_buffer_size_)
: max_buffer_size(max_buffer_size_)
{
}
//PUSH data into the buffer
blocking_stream &operator<<(TYPE &other)
{
std::unique_lock<std::mutex> mtx_lock(mtx);
while(buffer.size()>=max_buffer_size)
stop_if_full.wait(mtx_lock);
buffer.push(std::move(other));
mtx_lock.unlock();
stop_if_empty.notify_one();
return *this;
}
//POP data out of the buffer
blocking_stream &operator>>(TYPE &other)
{
std::unique_lock<std::mutex> mtx_lock(mtx);
while(buffer.empty())
stop_if_empty.wait(mtx_lock);
other.swap(buffer.front());
buffer.pop();
mtx_lock.unlock();
stop_if_full.notify_one();
return *this;
}
private:
size_t max_buffer_size;
std::queue<TYPE> buffer;
std::mutex mtx;
std::condition_variable stop_if_empty,
stop_if_full;
bool eof;
};
I modeled my code around this example:
http://www.justsoftwaresolutions.co.uk/threading/implementing-a-thread-safe-queue-using-condition-variables.html
What am I doing wrong and how do I fix the error?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
当线程对象超出范围并且处于可连接状态时(即 - 假设线程对象名为
t
则t.joinable()
返回 true),程序被终止。标准委员会对于可连接线程的析构函数还有另外两个选择。它可以悄悄地加入——但如果线程被卡住,加入可能永远不会返回。或者它可以分离线程(分离的线程不可连接)。然而,分离线程非常棘手,因为它们可能会一直存在到程序结束并扰乱资源的释放。因此,如果您不想终止程序,请确保加入(或分离)每个线程。When a thread object goes out of scope and it is in joinable state (i.e. - assuming the thread object is named
t
thent.joinable()
returns true), the program is terminated. The Standard Committee had two other options for the destructor of a joinable thread. It could quietly join -- but join might never return if the thread is stuck. Or it could detach the thread (a detached thread is not joinable). However, detached threads are very tricky, since they might survive till the end of the program and mess up the release of resources. So if you don't want to terminate your program, make sure you join (or detach) every thread.如何重现该错误:
编译并运行:
您会收到该错误,因为您没有加入或分离线程。
修复它的一种方法,像这样加入线程:
然后编译并运行:
修复它的另一种方法,像这样分离它:
编译并运行:
阅读分离 C++ 线程和加入 C++ 线程。
How to reproduce that error:
Compile and run:
You get that error because you didn't join or detach your thread.
One way to fix it, join the thread like this:
Then compile and run:
The other way to fix it, detach it like this:
Compile and run:
Read up on detaching C++ threads and joining C++ threads.
Eric Leschinski 和 Bartosz Milewski 已经给出了答案。在这里,我将尝试以更适合初学者的方式来介绍它。
一旦线程在某个范围内启动(该线程本身在线程上运行),就必须显式确保在线程超出范围之前发生以下情况之一:
请注意,当线程加入或分离时,它可能已经完成执行。仍然必须显式执行这两个操作中的任何一个。
Eric Leschinski and Bartosz Milewski have given the answer already. Here, I will try to present it in a more beginner friendly manner.
Once a thread has been started within a scope (which itself is running on a thread), one must explicitly ensure one of the following happens before the thread goes out of scope:
Note, by the time the thread is joined with or detached, it may have well finished executing. Still either of the two operations must be performed explicitly.
首先定义一个线程。如果在调用线程析构函数之前从未调用 join() 或 detach(),程序将中止。
如下所示,调用线程析构函数而不首先调用 join (等待其完成)或 detach 可以保证立即调用 std::terminate 并结束程序。
First you define a thread. And if you never call join() or detach() before calling the thread destructor, the program will abort.
As follows, calling a thread destructor without first calling join (to wait for it to finish) or detach is guarenteed to immediately call std::terminate and end the program.
是的,线程必须是join()。当主出口
yes, the thread must be join(). when the main exit
只要你的程序死了,然后没有分离或加入线程,就会发生这个错误。在不分离和加入线程的情况下,创建线程后应该进行无限循环。
同样有趣的是,在睡眠或循环之后,线程可以分离或连接。另外,通过这种方式,您不会收到此错误。
下面的示例还表明,第三个线程无法在主线程死亡之前完成其工作。但只要您在代码中的某个位置分离,这个错误也不会发生。
第三个线程休眠 8 秒,但 main 将在 5 秒后死亡。
As long as your program die, then without detach or join of the thread, this error will occur. Without detaching and joining the thread, you should give endless loop after creating thread.
It is also interesting that, after sleeping or looping, thread can be detach or join. Also with this way you do not get this error.
Below example also shows that, third thread can not done his job before main die. But this error can not happen also, as long as you detach somewhere in the code.
Third thread sleep for 8 seconds but main will die in 5 seconds.