互斥与忙等待tcp io
我不在乎成为一个cpu猪,因为我有一个线程分配给每个核心,系统线程阻塞到自己的集合。我的理解是,当其他任务要运行时,互斥是有用的,在这种情况下,互斥并不重要,因此我正在考虑在内存中的地址上有一个使用者线程循环,等待其值为非零,就像在循环recv()的单生产者线程中一样使用TCP_非块集进行初始化刚刚存储了信息,现在它不是零互斥与忙等待tcp io,c,linux,multithreading,tcp,mutex,C,Linux,Multithreading,Tcp,Mutex,我不在乎成为一个cpu猪,因为我有一个线程分配给每个核心,系统线程阻塞到自己的集合。我的理解是,当其他任务要运行时,互斥是有用的,在这种情况下,互斥并不重要,因此我正在考虑在内存中的地址上有一个使用者线程循环,等待其值为非零,就像在循环recv()的单生产者线程中一样使用TCP_非块集进行初始化刚刚存储了信息,现在它不是零 根据我的情况,我的植入是一个智能的植入,还是应该使用互斥或自定义中断,即使没有其他任务运行 在某些情况下,“忙等待”可以降低延迟并提高性能。 让其他线程使用CPU是不这样做的
根据我的情况,我的植入是一个智能的植入,还是应该使用互斥或自定义中断,即使没有其他任务运行 在某些情况下,“忙等待”可以降低延迟并提高性能。
让其他线程使用CPU是不这样做的明显原因,但还有其他原因:
select
或poll
(或epoll
)。这可以让您在等待时做其他事情,如果您愿意的话,并且不会浪费CPU时间。性能差异是否大到足以证明忙等待的合理性在某些情况下,“忙等待”可以降低延迟并提高性能。
让其他线程使用CPU是不这样做的明显原因,但还有其他原因:
select
或poll
(或epoll
)。这可以让您在等待时做其他事情,如果您愿意的话,并且不会浪费CPU时间。性能差异是否大到足以证明忙等待的合理性除了@ugoren的观点和其他人的评论外: 即使您有一个有效的用例用于忙着等待和烧录内核(这是公认的罕见情况),您也需要:
- 保护线程之间共享的数据。在访问任何复杂的共享数据结构时,都需要使用锁。人们倾向于研究这里的算法,但这些算法并不明显,而且容易出错,仍然被认为是深层次的黑魔法。在对并发性有了坚实的理解之前,不要尝试这些方法
- 通知线程已更改的状态。这是您使用或监视的地方。例如,在Linux上也有其他方法
- 保护线程之间共享的数据。在访问任何复杂的共享数据结构时,都需要使用锁。人们倾向于研究这里的算法,但这些算法并不明显,而且容易出错,仍然被认为是深层次的黑魔法。在对并发性有了坚实的理解之前,不要尝试这些方法
- 通知线程已更改的状态。这是您使用或监视的地方。例如,在Linux上也有其他方法
TCP\u NONBLOCK
在循环中调用recv
是愚蠢的。只需使用blockingrecv
,除非您在重试之间的循环中有其他事情要做,但由于您使用的是线程,因此不必这样做。同意R的意见,等待接收缓冲区变为非零也是一个糟糕的设计,因为你无法区分不接收任何内容和接收零数据之间的区别。啊,但我有一些技巧来检查消息是否完成,那么问题是什么?我可能会做一些其他事情,比如在循环等待更多信息时清除旧数据,或者我可以用另一个线程来处理它我真的不认为你知道你在做什么。你提到的每一件事(将线程固定到CPU、非阻塞io、“自定义中断”…)都没有动机说明你为什么要这么做。如果没有充分的理由这么做,那么在循环中使用TCP\u NONBLOCK
调用recv
是愚蠢的。只需使用blockingrecv
,除非您在重试之间的循环中有其他事情要做,但由于您使用的是线程,因此不必这样做。同意R的意见,等待接收缓冲区变为非零也是一个糟糕的设计,因为你无法区分不接收任何内容和接收零数据之间的区别。啊,但我有一些技巧来检查消息是否完成,那么问题是什么?我可能会做一些其他事情,比如在循环等待更多信息时清除旧数据,或者我可以再来一杯