代码之家  ›  专栏  ›  技术社区  ›  Aditya Sehgal

一个生产者,两个消费者和pthread\u cond\u signal和pthread\u mutex\u lock的用法

  •  2
  • Aditya Sehgal  · 技术社区  · 14 年前

    我对pthread编程还相当陌生,我正在努力使自己的头脑清醒过来 cond_signal mutex_lock . 我正在写一个示例程序 一个生产商 螺纹和 两个消费者 线程。

    我正在尝试使用pthread\u cond\u signal&pthread\u mutex\u锁定生产者和消费者之间的以下方式。

    [在制作人处]

    0)等待数据包到达

    pthread_mutex_lock(&cons1Mux)

    3) 向耗电元件1进程发送信号 pthread_cond_signal(&msgForCons1)

    5) 转到步骤0

    [在消费者处]

    pthread\u mutex\u lock(&消耗1倍)

    2) 等待信号 pthread_cond_wait(&msgForCons1,&cons1Mux)

    3) 醒来后,读一下包

    4) 从队列中删除。

    5) 解锁互斥锁 pthread_mutex_unlock(&cons1Mux)

    以上步骤正确吗?如果恰好在步骤5之后发生了从使用者线程到生产者线程的切换,那么生产者可能会发出一个数据包正在等待的信号,即使使用者还没有开始监听该信号。会不会导致“信号丢失”?

    这些步骤还有其他问题吗?

    1 回复  |  直到 14 年前
        1
  •  2
  •   timday    14 年前

    pthread_cond_signal

    你应该做的是,在消费者中,一旦你获得了互斥,测试是否有工作要做。如果有,那么,你有一个互斥;取得所有权,更新状态,然后去做。你只需要在无事可做的情况下等待。

    cannonical的例子是:

    decrement_count() 
       { pthread_mutex_lock(&count_lock); 
    
         while (count == 0) 
            pthread_cond_wait(&count_nonzero, &count_lock); 
         count = count - 1; 
         pthread_mutex_unlock(&count_lock); 
       } 
    
    increment_count() 
       { pthread_mutex_lock(&count_lock); 
         if (count == 0)
           pthread_cond_signal(&count_nonzero); 
         count = count + 1;
         pthread_mutex_unlock(&count_lock); 
        }