How to provide a sequence of interleaving threads to show that a code breaks and doesn't provide perfect synchronization?

送分小仙女□ 提交于 2019-12-20 06:17:40

问题


I know what the following code does and I know why it is a broken code for synchronization as it has only one conditional variable while we need two but I don't know how to provide a sequence of interleaving threads for showing it doesn't work. Can you show why this code doesn't work with an example?

1   cond_t cond = PTHREAD_COND_INITIALIZER; 
2  mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;;
3
4  void *producer(void *arg) {
5    int i;
6    for (i = 0; i < loops; i++) {
7      Pthread_mutex_lock(&mutex);
8      while (count == 1)
9        Pthread_cond_wait(&cond, &mutex);
10     put(i);
11     Pthread_cond_signal(&cond);
12     Pthread_mutex_unlock(&mutex);
13   }
14 }
15
16 void *consumer(void *arg) {
17   int i;
18   for (i = 0; i < loops; i++) {
19     Pthread_mutex_lock(&mutex);
20     while (count == 0)
21       Pthread_cond_wait(&cond, &mutex);
22     int tmp = get();
23     Pthread_cond_signal(&cond);
24     Pthread_mutex_unlock(&mutex);
25     printf("%d\n", tmp);
26   }
27 }

回答1:


Presuming that put() sets count to 1 and get() sets count to 0, this code is actually fine as long as you have only one producer and one consumer.

If you have more than one producer, then the pthread_cond_signal() in the producer might wake up one of the other producers instead of a consumer, and then no consumers will proceed. The same problem exists if you have more than one consumer.

You can fix this either by introducing separate condition variables for empty and full, or by using pthread_cond_broadcast() instead of pthread_cond_signal().




回答2:


"cond" is not initialized. You have a race condition between consumer and producer. If any of the "while" condition becomes true, they will result in infinite loop as no instruction changes the values of "count" in the "while" scopes (both).



来源:https://stackoverflow.com/questions/19642938/how-to-provide-a-sequence-of-interleaving-threads-to-show-that-a-code-breaks-and

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!