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

时间:2017-01-10 14:14:42

标签: c++ multithreading sockets

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

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接收输入..

2 个答案:

答案 0 :(得分:2)

除了现有的答案之外,请注意一个有用的设计模式是使用管道(或者更确切地说,是一个socketpair()),其中主线程拥有一端而'select thread'拥有另一端。然后,要停止'选择线程',您可以在管道上发送一个字符(假设已添加描述符以进行选择)。这会唤醒应该终止的线程(线程在select中休眠,直到套接字或控制管道上发生某些事情为止)。

答案 1 :(得分:0)

正如man page of recvfrom

中所述

您需要将接收者更改为先调用select(请参阅man page)以检查是否有要阅读的内容。如果有什么东西要读,你可以recvfrom知道它现在不会阻止。如果不读取任何内容,select也可以超时。在这种情况下,您至少可以检查是否应该结束接收器线程。