有一个线程正在运行
recv
在循环中的阻塞UDP套接字上。我们需要停止该线程并关闭该套接字。
例子:
#include <unistd.h>
#include <sys/socket.h>
#include <thread>
#include <atomic>
std::atomic<int> the_socket;
void threadf() {
for(;;) {
char c;
int ret = recv(the_socket, &c, 1, 0);
if(ret == 0 || ret == -1) {
break;
}
}
close(the_socket);
}
int main() {
the_socket = socket(AF_INET, SOCK_DGRAM, 0);
std::thread *t = new std::thread(threadf);
usleep(200000);
shutdown(the_socket, SHUT_RDWR); // ENOTCONN
t->join();
delete t;
return 0;
}
-
它创建UDP套接字
-
它启动另一个线程,同步地从该套接字接收数据包。
-
delete t
这是个坏主意。
close(the_socket)
shutdown
虽然本身失败了,但这项工作:
[pid 22289] nanosleep({tv_sec=0, tv_nsec=200000000}, <unfinished ...>
[pid 22290] <... set_robust_list resumed> ) = 0
[pid 22290] recvfrom(3, <unfinished ...>
[pid 22289] <... nanosleep resumed> NULL) = 0
[pid 22289] shutdown(3, SHUT_RDWR) = -1 ENOTCONN (Transport endpoint is not connected)
[pid 22290] <... recvfrom resumed> "", 1, 0, NULL, NULL) = 0
问题
-
该方案的可移植性和可靠性如何?
不,根本不是便携式的。
-
是的确切行为
在多线程环境中有什么记载?
不
-
是的影响
关机
在某处记录的非连接/UDP套接字上?
-
可以对套接字执行其他操作来中断吗
在相邻线程上可靠且可移植?
使现代化
close
然而,在那里工作。。。