我试图了解并行线程上套接字API(recv
,send
,select
,close
等)的用法。这意味着在两个并行线程上使用一个套接字文件描述符我已经完成了this个问题。但我仍然无法找到任何解释多线程中套接字API用法的标准文档。即使opengroup手册页也没有说明这一点。
我还想知道下面列出的并行线程使用场景是否在POSIX套接字API中有效
1)在两个并行线程中调用recv
和send
int main_thread() {
fd = do_connect(); //TCP or UDP
spawn_thread(recv_thread, fd);
spwan_thread(send_thread, fd);
...
}
int recv_thread(fd) {
while(1) {
recv(fd, ..)
...
}
}
int send_thread(fd) {
while(1) {
send(fd, ..)
...
}
}
2)在两个并行线程中使用recv
调用send
和select
int recv_thread(fd) {
while(1) {
select(fd in readfd)
recv(fd, ..)
...
}
}
int send_thread(fd) {
while(1) {
select(fd in write)
send(fd, ..)
...
}
}
3)在两个并行线程中使用recv
,send
,setsockopt
呼叫ioctl
和fcntl
int recv_thread(fd) {
int flag = 1
while(1) {
ioctl(fd, FIONBIO, &flag); //enable non block
recv(fd, ..)
flag = 0;
ioctl(fd, FIONBIO, &flag); //disable non block
...
}
}
int send_thread(fd) {
while(1) {
select(fd in write)
send(fd, ..)
...
}
}
答案 0 :(得分:2)
Posix functions are thread-safe "by default":
2.9.1线程安全
本卷POSIX.1-2008定义的所有功能均为 线程安全,但不需要以下功能 线程安全的。
正如许多人已经评论过的那样,你可以安全地从不同的线程中调用上面提到的调用。
案例" 1"和" 2"非常典型(一个线程接收,一个发送,每个线程处理许多与select()
的连接)用于生产代码。
案例" 3"是某种奇怪的,可能是麻烦的来源(它会起作用,调用是有效的,但是获得所需的行为可能并不简单)。通常,您可以在开始时将套接字置于非阻塞模式,并在send()
/ recv()
调用中处理EAGAIN / EWOULDBLOCK错误或阻止并使用select()
/ pselect()
/ { {1}} / poll()
。
在这种情况下,发送线程会随机发现"发现"套接字处于阻塞或非阻塞模式:我不会这样做。