Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
互斥与忙等待tcp io_C_Linux_Multithreading_Tcp_Mutex - Fatal编程技术网

互斥与忙等待tcp io

互斥与忙等待tcp io,c,linux,multithreading,tcp,mutex,C,Linux,Multithreading,Tcp,Mutex,我不在乎成为一个cpu猪,因为我有一个线程分配给每个核心,系统线程阻塞到自己的集合。我的理解是,当其他任务要运行时,互斥是有用的,在这种情况下,互斥并不重要,因此我正在考虑在内存中的地址上有一个使用者线程循环,等待其值为非零,就像在循环recv()的单生产者线程中一样使用TCP_非块集进行初始化刚刚存储了信息,现在它不是零 根据我的情况,我的植入是一个智能的植入,还是应该使用互斥或自定义中断,即使没有其他任务运行 在某些情况下,“忙等待”可以降低延迟并提高性能。 让其他线程使用CPU是不这样做的

我不在乎成为一个cpu猪,因为我有一个线程分配给每个核心,系统线程阻塞到自己的集合。我的理解是,当其他任务要运行时,互斥是有用的,在这种情况下,互斥并不重要,因此我正在考虑在内存中的地址上有一个使用者线程循环,等待其值为非零,就像在循环recv()的单生产者线程中一样使用TCP_非块集进行初始化刚刚存储了信息,现在它不是零


根据我的情况,我的植入是一个智能的植入,还是应该使用互斥或自定义中断,即使没有其他任务运行

在某些情况下,“忙等待”可以降低延迟并提高性能。

让其他线程使用CPU是不这样做的明显原因,但还有其他原因:

  • 你消耗更多的能量。空闲CPU进入低功耗状态,大大降低了功耗。功耗是数据中心的一个主要问题,任何严重的应用程序都必须避免浪费电源

  • 如果您的代码在虚拟机中运行(现在所有东西都在虚拟化),那么您的机器将与其他机器争夺CPU。消耗100%的CPU会减少其他人的CPU占用,并且可能会导致虚拟机监控程序在真正需要时为您的机器提供更少的CPU

  • 你应该始终坚持主流方法,除非有充分的理由不这样做。在这种情况下,主流是使用
    select
    poll
    (或
    epoll
    )。这可以让您在等待时做其他事情,如果您愿意的话,并且不会浪费CPU时间。性能差异是否大到足以证明忙等待的合理性


  • 在某些情况下,“忙等待”可以降低延迟并提高性能。

    让其他线程使用CPU是不这样做的明显原因,但还有其他原因:

  • 你消耗更多的能量。空闲CPU进入低功耗状态,大大降低了功耗。功耗是数据中心的一个主要问题,任何严重的应用程序都必须避免浪费电源

  • 如果您的代码在虚拟机中运行(现在所有东西都在虚拟化),那么您的机器将与其他机器争夺CPU。消耗100%的CPU会减少其他人的CPU占用,并且可能会导致虚拟机监控程序在真正需要时为您的机器提供更少的CPU

  • 你应该始终坚持主流方法,除非有充分的理由不这样做。在这种情况下,主流是使用
    select
    poll
    (或
    epoll
    )。这可以让您在等待时做其他事情,如果您愿意的话,并且不会浪费CPU时间。性能差异是否大到足以证明忙等待的合理性


  • 除了@ugoren的观点和其他人的评论外:

    即使您有一个有效的用例用于忙着等待和烧录内核(这是公认的罕见情况),您也需要:

    • 保护线程之间共享的数据。在访问任何复杂的共享数据结构时,都需要使用锁。人们倾向于研究这里的算法,但这些算法并不明显,而且容易出错,仍然被认为是深层次的黑魔法。在对并发性有了坚实的理解之前,不要尝试这些方法
    • 通知线程已更改的状态。这是您使用或监视的地方。例如,在Linux上也有其他方法
    以下是一些链接,让你知道这比你想象的要困难得多:


    除了@ugoren的观点和其他人的评论之外:

    即使您有一个有效的用例用于忙着等待和烧录内核(这是公认的罕见情况),您也需要:

    • 保护线程之间共享的数据。在访问任何复杂的共享数据结构时,都需要使用锁。人们倾向于研究这里的算法,但这些算法并不明显,而且容易出错,仍然被认为是深层次的黑魔法。在对并发性有了坚实的理解之前,不要尝试这些方法
    • 通知线程已更改的状态。这是您使用或监视的地方。例如,在Linux上也有其他方法
    以下是一些链接,让你知道这比你想象的要困难得多:


    如果没有很好的理由这样做,那么使用
    TCP\u NONBLOCK
    在循环中调用
    recv
    是愚蠢的。只需使用blocking
    recv
    ,除非您在重试之间的循环中有其他事情要做,但由于您使用的是线程,因此不必这样做。同意R的意见,等待接收缓冲区变为非零也是一个糟糕的设计,因为你无法区分不接收任何内容和接收零数据之间的区别。啊,但我有一些技巧来检查消息是否完成,那么问题是什么?我可能会做一些其他事情,比如在循环等待更多信息时清除旧数据,或者我可以用另一个线程来处理它我真的不认为你知道你在做什么。你提到的每一件事(将线程固定到CPU、非阻塞io、“自定义中断”…)都没有动机说明你为什么要这么做。如果没有充分的理由这么做,那么在循环中使用
    TCP\u NONBLOCK
    调用
    recv
    是愚蠢的。只需使用blocking
    recv
    ,除非您在重试之间的循环中有其他事情要做,但由于您使用的是线程,因此不必这样做。同意R的意见,等待接收缓冲区变为非零也是一个糟糕的设计,因为你无法区分不接收任何内容和接收零数据之间的区别。啊,但我有一些技巧来检查消息是否完成,那么问题是什么?我可能会做一些其他事情,比如在循环等待更多信息时清除旧数据,或者我可以再来一杯