gpt4 book ai didi

c++ - 解除线程与另一个线程的阻塞

转载 作者:行者123 更新时间:2023-12-02 10:23:50 25 4
gpt4 key购买 nike

我正在寻找一种能够同时从网络接收数据的同时将数据输入到终端的方法。

为此,我创建了一个新线程dataCapture(std::thread),该线程将使用std::cin获取输入。主线程是接收器。

当网络发送字符串“end”时,程序需要退出。

这是简化的代码:

void dataCapture()
while (! quit) {
std::string data;
std::cout << "Enter data: ";
std::cin >> data;
}
}

bool quit=false;

int main() {
// socket creation
// connection to server
const std::string quit_value = "end";


std::thread datacapture_T(dataCapture);

while (! quit) {
char recep[1024];
recv(sd, recep, sizeof(recep),0);
if (recep == quit_value) {
quit=true;
}
}
datacapture_T.join();
return 0;
}

那是行不通的,因为在接收到 "end"之后, maindatacapture_T.join()上阻塞了,因为 dataCapturestd::cin调用中被阻塞了。

是否可以从main取消阻止 dataCapture线程?

如果不是,有可能强行杀死它吗?

ps:为简化起见,我没有添加锁。

感谢帮助!

最佳答案

从理论上和实践上,都没有干净的方法可以通过编程方式杀死线程。

以编程方式解除阻塞和关闭线程(等待任何类型的输入)的标准方法是使用select()pipe():

  • 创建一个pipe()。
  • select()创建一个文件描述符集,其中包含您的输入文件描述符,read()pipe()
  • 而不是对cin进行阻塞读取,而是对select()进行阻塞调用。
  • 如果select()告诉您pipe()中有一些要读取的内容,请退出线程。由于在线程中检测到终止请求,因此您可以清理所有资源并完成所有处理。这是关键。
  • 如果select()告诉您从cin中读取某些内容,请对其进行读取和处理。
  • 来自任何其他线程,例如在main()的末尾:
  • 每当您想终止线程时,请将一个字节(值无关紧要)写入pipe()
  • join()线程。

  • 您认为这种方法听起来很随意而且很复杂?它是!但是,这是很常见的做法,因为许多框架和程序都在使用它,所以您可以依靠它来工作。

    还有一些较不理想的选择,例如轮询输入(非阻塞)和检查停止标志。也许最有用的替代方法是根本不使用任何其他线程来获取输入,并且对所有I / O使用单线程事件驱动的系统,而仅在其他线程中进行内部处理。

    线程不是实现I / O并发的有用机制。线程对于创建CPU处理并发很有用。

    关于c++ - 解除线程与另一个线程的阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55091780/

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