【问题标题】:how to suspend the other threads when one thread is wishing to execute or print something?当一个线程希望执行或打印某些东西时,如何挂起其他线程?
【发布时间】:2014-02-19 05:58:43
【问题描述】:

我是 C(LINUX) 中的多线程的新手

我正在做一个 multiple client server(single) 程序,这里我使用 threads 来执行服务器,所以当客户端等待回复时我需要其他线程(其他服务器线程)不应运行,

        while(n = read(conn->sock, buffer, sizeof(buffer))  > 0 )
        {
            //HERE I NEED THE LOCK THE OTHER THREADS FROM THEIR EXECUTION

                    //process
                    //process
                    //end of process

            //HERE I NEED TO RELEASE LOCK FOR THE OTHER THREADS EXECUTION



        }
    }

我没有在网上找到任何具体的东西,即使是一些示例 URL 也会有所帮助

【问题讨论】:

  • 为什么?大概这是处理此套接字的唯一线程。如果必须,它将阻止send(),并且它似乎没有做任何其他需要锁定全局资源的事情。例如,buffer 可以是局部变量。
  • 哦,顺便说一句,while 循环中的条件是错误的,operator precedence 对于> 运算符来说更高,所以你正在做的是将结果分配给n比较,并将其用于条件。
  • 为什么是无条件的break?它使循环无用,它会跳过解锁。
  • 是的,我注意到了,我忘了改变,谢谢

标签: c++ c linux multithreading sockets


【解决方案1】:

为此,您可以使用例如condition variables,你可以在这里notify all waiting threads

【讨论】:

    【解决方案2】:

    如果您需要纯 C,您可以使用 POSIX pthreads 中的条件变量。 https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables

    【讨论】:

    • 感谢 Alex,这是对 Windows 示例的补充; @siva 这应该用于使用 POSIX 线程的操作系统,即 Unix(包括 Linux)
    【解决方案3】:

    您应该使用互斥 (mutex)。如果您使用的是 Windows,我会在临界区对象上使用 EnterCriticalSection。

    您也可以使用 C++11 中添加的std::mutex 来尝试为此类事情创建标准化技术。

    基本上,您有需要传输或访问某些东西的线程获得互斥锁的“所有权”,所有其他线程在采取行动之前会检查互斥锁是否已被拥有。如果互斥锁被拥有,其他线程将等待直到它被释放,从而等待轮到他们采取行动。

    强烈建议使用操作系统内置的方法来执行此操作,就像我对 Windows 的建议一样。如果你不这样做,你将不会有同等程度的公平。大多数操作系统都对此进行了优化,而 STL 对象可能没有。

    编辑: 我有些错过了 Linux 标签,但 AlexBG 提供了 POSIX 内置互斥锁使用的链接:https://computing.llnl.gov/tutorials/pthreads/#ConditionVariables

    【讨论】:

    • 您知道 C++11 线程类(包括互斥体和条件变量)很可能会使用平台原生函数吗?
    • 这是真的,但不能保证。在这种情况下,临界区对象实际上在实现方面更快,因为它们正是针对这个问题的。它们会自动等待等,为线程调度提供了一个非常干净的接口。
    • 这是我的疑问,哪个线程会在释放锁(互斥体)后,是首先发现互斥体当前处于锁定状态的线程还是随机的线程(线程)会运行跨度>
    • Windows 有非常高效的线程公平时间管理(可能是最好的)并且不会让一个线程拥有锁的优先级。但是你不能在不以某种方式排队的情况下强制线程的顺序(这需要你做一些额外的工作来管理执行顺序)
    【解决方案4】:

    搜索线程同步。
    全局变量将由线程共享,因此使用全局变量,然后可以使用该变量获取锁。

    【讨论】:

    • 对于两个客户端全局变量会很好,但是对于两个以上,我们无法预测锁定释放后哪个客户端将运行(我想)
    • 但我认为我们可以像二进制信号量一样实现获取独占锁,对吧?你想要的是互斥锁吧?
    • 问题不是需要信号量的东西。他似乎想要先进先出的线程调度等待互斥锁。然而,如果不强迫自己这样做,这取决于操作系统如何发生
    【解决方案5】:

    为了保护对共享资源的并发访问,可以使用简单(快速)互斥锁。

    #include <pthread.h>
    
    pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
    
    [...]
    
    
    void some_func(void)
    {
      [...]
    
      pthread_mutex_lock(&mutex);
    
      /* Access to shared resource here (print to stdout for example). */
    
      pthread_mutex_unlock(&mutex);
    
      [...]
    }
    

    请注意,为了便于阅读,此代码缺少错误检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-16
      • 2015-12-01
      • 1970-01-01
      相关资源
      最近更新 更多