Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.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_Pthreads_Semaphore - Fatal编程技术网

信号量互斥锁防止死锁-C程序

信号量互斥锁防止死锁-C程序,c,pthreads,semaphore,C,Pthreads,Semaphore,我有一个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(&mute

我有一个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

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

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

不要有太多的锁定,否则会降低性能。考虑到您的需求,一个互斥器就足够了,因为只有生产者和消费者线程会进入关键部分。

对于您的监视器,使用一个条件变量,并让生产者/消费者在状态改变时发出一个谓词改变的信号。我的假设是否正确,即当线程调用值为零的信号量上的wait时,此实现将线程置于等待状态,因此没有cpu循环?我的观点是,监视线程需要防止在将输出写入屏幕时更改数据,因此监视器线程要求进行数据同步,从而产生消费者或消费者