【问题标题】:Semaphores Mutex Locks preventing Deadlocks - C Program信号量互斥锁防止死锁 - C 程序
【发布时间】:2023-03-09 08:41:01
【问题描述】:

我在 C 语言中有一个多线程应用程序 - 有 3 个线程,为了防止同步问题/死锁,我正在使用信号量和互斥锁。 1 个线程是消费者,1 个线程是生产者,1 个线程是监视器,输出消费者/生产者线程更新的值。初始化信号量

sem_init(&empty, 0, 10);
sem_init(&full, 0, 0);

数据在生产者中同步

//decide to go into critical section
sem_wait(&empty);
pthread_mutex_lock(&mutex);
Attempt_Park();
/* release locks */
pthread_mutex_unlock(&mutex);
/* signal full */
sem_post(&full);

对于消费者来说也是如此。但是我不知道如何将信号量与输出当前数据(链表的)的监视器线程一起使用 - 目前我只使用互斥锁,但我知道最终这将是一个问题

//user presses enter
/* Acquire lock */
pthread_mutex_lock(&mutex);
//output data to screen

由于该线程不参与更改数据,我无法使用信号量让线程等待,但生产者或消费者可以在监视器线程写入屏幕时更改数据。我应该使用二进制信号量吗?如果是这样,我不知道如何应用它。

【问题讨论】:

  • 对于您的监视器,使用条件变量并让生产者/消费者在状态变化时发出谓词变化信号。
  • 我的假设是否正确

标签: c pthreads semaphore


【解决方案1】:

只在生产者或消费者线程修改数据时才运行监控线程。无需担心监视器线程的锁定机制。使用信号机制唤醒线程以输出数据

【讨论】:

    【解决方案2】:

    不要有太多的锁定,这会降低你的性能。想想你的要求,一个互斥锁就足够了,因为只有生产者和消费线程会进入临界区。

    【讨论】:

    • 我的观点是,虽然监控线程需要防止消费者或生产者在将输出写入屏幕时更改数据,所以监控线程需要数据同步
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2015-10-26
    • 2022-11-05
    • 1970-01-01
    • 2015-06-19
    相关资源
    最近更新 更多