Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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
C 如何从等待条件变量/信号量的线程池中唤醒线程?_C_Multithreading_Operating System_Synchronization_Semaphore - Fatal编程技术网

C 如何从等待条件变量/信号量的线程池中唤醒线程?

C 如何从等待条件变量/信号量的线程池中唤醒线程?,c,multithreading,operating-system,synchronization,semaphore,C,Multithreading,Operating System,Synchronization,Semaphore,情况: 线程A调用等待(&sem);//成功 线程B调用等待(&sem);//块 线程C调用wait(&sem);//块 线程A调用信号(&sem) 现在怎么办??? 哪根线被唤醒 这是随机的,对吗 但是,我总是希望线程B在线程C之前唤醒,因为B在线程C之前调用了wait。是否有一种现有的机制可以使用同步来实现这一点。机械。?如果需要,请明确提及任何其他数据结构的使用 实际上我在找这样的东西。 可以使用条件变量来序列化线程执行 Mutex M; Condition Variable C = 1;

情况:

  • 线程A调用等待(&sem);//成功
  • 线程B调用等待(&sem);//块
  • 线程C调用wait(&sem);//块
  • 线程A调用信号(&sem) 现在怎么办??? 哪根线被唤醒

    这是随机的,对吗


    但是,我总是希望线程B在线程C之前唤醒,因为B在线程C之前调用了wait。是否有一种现有的机制可以使用同步来实现这一点。机械。?如果需要,请明确提及任何其他数据结构的使用

    实际上我在找这样的东西。 可以使用条件变量来序列化线程执行

    Mutex M;
    Condition Variable C = 1;
    
    thread_function_A()  
    {
        pthread_mutex_lock(M);
    
        while (C != 1)
            pthread_cond_wait(C, M);
    
        CRITICAL SECTION STARTS;
        CRITICAL SECTION ENDS;
        C++;
        pthread_mutex_unlock(M);
    }
    
    thread_function_B()  
    {
        pthread_mutex_lock(M)
    
        while (C != 2)
            pthread_cond_wait(C, M);
    
        CRITICAL SECTION STARTS
        CRITICAL SECTION ENDS
        C++;
        pthread_mutex_unlock(M)
    }
    
    thread_function_C()  
    {
        pthread_mutex_lock(M)
    
        while (C != 3)
            pthread_cond_wait(C, M);
    
        CRITICAL SECTION STARTS
        CRITICAL SECTION ENDS
        C++;
        pthread_mutex_unlock(M)
    }
    

    在您发布的示例中,它们都没有,因为线程A调用wait(&sem);表示线程A调用信号(&sem);永远也达不到。如果更换线程,则调用信号(&sem);使用线程D调用信号(&sem);,线程A、B或C中的任何一个都将被唤醒,通常您无法控制哪个线程。初始条件:sem初始化为1,线程A是第一个成功获取信号量的线程。那么,为什么信号(&sem)不会到达呢?如果初始条件发生变化,就会到达。软件设计的一部分就是让这些考虑变得无关紧要。如果你不在乎哪个线程被唤醒,那么你就不会失望。如果你在乎哪个线程被唤醒,那么你就唤醒了那个线程。