gpt4 book ai didi

c++ - 如何杀死被条件变量锁定的线程?

转载 作者:行者123 更新时间:2023-11-30 02:14:05 25 4
gpt4 key购买 nike

我创建了一个线程,然后使用条件变量“调用”(即解锁)处理它。

基本代码如下:

#include <iostream>
#include <thread>
#include <condition_variable>

std::condition_variable t1_cond;

void task() {
std::mutex mtx;
std::unique_lock<std::mutex> lock{ mtx };

while (true) {
t1_cond.wait(lock);
std::cout << "doing somethings..." << std::endl;
}
}

int main() {
int message;
std::thread t1(task);

for (int i = 0; i < 3; i++) {
std::cin >> message;

t1_cond.notify_one();

}

// here I want to kill the t1 thread
// t1.join() works only if I first release lock, but it seems a weird approch

return 0;
}

正如您在代码中看到的,最后我想“残酷地”杀死线程,即使它正在处理(或等待)。

你会怎么做? t1_cond.notify_one(); 并使用另一个条件变量,如果被标记,就返回?

对于基本任务来说似乎有点复杂,也许还有一些我还不知道的奇特方法。

最佳答案

正如其他人在评论中指出的那样,不要对线程进行苛刻的终止。发出信号让它退出,然后等待它完成。

例如,我们可以在 thread 和 main 之间使用 a 作为全局(或共享)变量。还有其他方法可以做到这一点,但这个是有效的,例如:

声明一个全局变量。让我们使用 atomic,这样我们就不必深入讨论线程间缓存一致性。

#include <atomic>
std::atomic_bool g_exitCondition;

std::condition_variable t1_cond;

更改线程中的 while 循环以检查退出条件。

while (g_exitCondition == false) {
t1_cond.wait(lock);
if (g_exitCondition == false) {
std::cout << "doing somethings..." << std::endl;
}
}
std::cout << "Exiting thread" << std::endl;

然后正确地指示线程退出并等待它在 main 中完成:

    g_exitCondition = true;
t1_cond.notify_all();
t1.join();

return 0;
}

关于c++ - 如何杀死被条件变量锁定的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58481511/

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