C++等待用户输入的中断线程

C++ interrupt thread waiting for user-input

本文关键字:中断 线程 输入 等待 用户 C++      更新时间:2023-10-16

我有一个问题,我需要中断并等待输入。知道怎么做吗?

bool run;
void partReceive() {
    while(run) {
        ...
        int rect_len = (int) recvfrom(servSockFD, buffer, 
              MAX_MESSAGE_LEN, 0, (struct sockaddr*) &newAddr, &slen);
        ...
    }
}
void partCount() {
    int i = 0;
    while(run) {
        i++;
        if (i >= 5) {
            run = false;
        }
    }
 }
 int main() {
       run = true;
       thread receive(partReceive);
       thread count(partCount);
       count.join();
       receive.join();
       return 0;
 }

这是行不通的,因为partReceive()将一直保持,直到它从socket接收到输入。

除了现有的答案之外,请注意,一个有用的设计模式是使用管道(或者更准确地说,套接字对()),其中主线程拥有一端,"选择线程"拥有另一端。然后,要停止"选择线程",您可以在管道上发送一个字符(假设已添加描述符以选择 )。这将唤醒应终止的线程(线程在选择中休眠,直到套接字或控制管道上出现问题)。

正如 recvfrom 的手册页中所建议的:

您需要将接收方更改为第一次调用select(请参阅手册页)以检查是否有要读取的内容。如果有什么要读的,你可以recvfrom知道它现在不会阻塞。 如果不读取任何内容,select也可以超时。在这种情况下,您至少可以检查是否应结束接收器线程。