gpt4 book ai didi

c++ - 在 C++ 中使用三个线程退出两个并发队列

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:55:27 27 4
gpt4 key购买 nike

我在退出多线程、多队列 C++ 程序时遇到问题。该图显示了队列和线程结构。图表在这里:http://i.stack.imgur.com/JGhXs.png

简而言之,我有三个线程和两个并发队列。 second_handler(second_thread) 从第一个队列弹出并推送到第二个队列。所有(似乎)工作正常,直到我想通过敲击键盘键退出程序。我收到此错误:

在抛出“boost::exception_detail::clone_impl >”实例后调用终止 什么(): boost::lock_error中止

这是我的代码:主要

int main() {
startMultiThreading();
cout <<"I"<<endl;
}

开始多线程

void startMultiThreading() {
boost::thread_group someVar_workers;
boost::thread_group someOtherVar_workers;

concurrent_queue<someVar* > someVar_queue(&someVar_workers);
concurrent_queue<someOtherVar*> someOtherVar_queue(&someOtherVar_workers);

boost::thread *first_thread = new boost::thread(first_handler, &someVar_queue);
boost::thread *second_thread = new boost::thread(second_handler, &someVar_queue, &someOtherVar_queue);
boost::thread *third_thread = new boost::thread(third_handler, &someOtherVar_queue);

someVar_workers.add_thread(first_thread);
someVar_workers.add_thread(second_thread);

someOtherVar_workers.add_thread(second_thread);
someOtherVar_workers.add_thread(third_thread);

while (true) {
if (thread_should_exit) {
cout << "threads should be killed" << endl;
while (!someVar_queue.empty()) {
usleep(1000);
}
someVar_workers.remove_thread(second_thread);
while (!someOtherVar_queue.empty()) {
usleep(1000);
}
someOtherVar_queue.cancel();
someVar_workers.join_all();
someOtherVar_workers.remove_thread(second_thread);
someOtherVar_workers.join_all();
break;
}
usleep(10000);
}
cout << "H" << endl;
}

我想要的是完成两个队列然后正常终止的程序。我期望的是在程序终止之前看到打印的“I”。这是输出:

    End of first_handler
threads should be
second_handler is canceled
End of second_handler
H
terminate called after throwing an instance of 'concurrent_queue<someOtherVar*>::Canceled'
Aborted
Press [Enter] to close the terminal ...

关闭线程和队列时我做错了什么?

谢谢

最佳答案

首先,请参阅 KillianDS 的评论 - 您的示例太长了。

另一件事是:永远不要直接调用析构函数!

析构函数是一种特殊的东西,语言保证在变量范围的末尾调用它。如果您手动调用它,它将被第二次调用,这很可能会导致未定义的行为。

Calling destructor manually

关于c++ - 在 C++ 中使用三个线程退出两个并发队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10512269/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com