【问题标题】:C++ interrupt thread waiting for user-inputC++ 中断线程等待用户输入
【发布时间】:2023-03-14 21:15:01
【问题描述】:

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

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() 将一直​​保持到它接收到来自套接字的输入..

【问题讨论】:

  • 怎么办?
  • 我会担心partCount,因为它与实际接收零件没有关系来计算它们
  • 您使用recvfrom() 意味着正在使用UDP 套接字。如果是这样,那么只需将run 设置为false,然后将sendto() 一个空白数据报发送到侦听套接字端口,并让partReceive() 正常接收它,然后它就可以自行退出。

标签: c++ multithreading sockets


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    正如man page of recvfrom中所建议的:

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

    【讨论】:

    • 非常感谢
    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多