c - 为什么接受命令不是套接字中的 euqal 连接命令?
问题描述
首先,我编写了一个服务器和一个客户端线程,参考Beej's Guide to Network Programming。
我做了一些改变如下:
服务器.c
void *server(void *pdata){
...
printf("server ----> 1\n");
// wait for accept
printf("server ----> 2\n");
...
}
客户端.c
void *client( void *pdata ){
...
printf("client ----->(%d) 1\n", gettid( ));
// wait for accept
printf("client ---->(%d) 1\n", gettid( ));
...
}
主程序
int main( int argc, char *argv[] ){
pthread_t serverid;
pthread_t id;
void *tmp;
pthread_create( &serverid, NULL, server, NULL );
sleep(1);
pthread_create( &id, NULL, client, NULL );
pthread_create( &id, NULL, client, NULL );
pthread_join( serverid, &tmp );
return 0;
}
当我运行这个测试用例时,有时我会得到这样的正确顺序:
server ----> 1
client ----->(36317) 1
client ----->(36318) 1
client ----->(36317) 2
client ----->(36318) 2
server ----> 2
server ----> 1
server ----> 2
server ----> 1
但是,在一半的时间里,结果看起来像这样:
server ----> 1
client ----->(36347) 1
client ----->(36348) 1
client ----->(36348) 2
client ----->(36347) 2
server ----> 2
server ----> 1
server ----> 2
server ----> 1
我的问题是为什么我可以得到 TCP 请求的非严格顺序。
解决方案
这根本与网络无关。线程不能保证按照您指定的顺序启动,所以这很正常。请阅读有关线程的信息,如果可能的话,请阅读有关 POSIX 线程的信息,以便您获得更好的洞察力。
推荐阅读
- python - 在控制台中显示下载进度
- c# - 如何设置相机与缩放对象的距离?
- java - 找不到方法“io.realm.annotations.RealmClass.name”
- python - Django:如何在管理面板中检测对象请求?
- python - 在子图中绘制网格 Python matplotlib
- php - 化脓字符的新行
- symfony - 表单提交后我应该在哪里放置更新 sql 操作(Symfony / Sylius)
- java - 在集成测试之前运行主 springboot 应用程序
- javascript - 两种方式的数据绑定不适用于淘汰 ObservableArrays
- redis - redis - 按模式/前缀获取所有哈希