【发布时间】:2016-05-13 04:34:49
【问题描述】:
我已经成功地在 C 中实现了互斥锁和条件变量锁,并尝试使用信号量来实现相同的目标。下面是我的代码,但是执行时,输出总是24而不是12。请帮助我理解如何使用信号量。
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <semaphore.h>
#define NUM_THREADS 2
#define TCOUNT 12
#define COUNT_LIMIT 12
int count = 0;
sem_t sem;
void *dum(void *t_id){
long id = long(t_id);
for (int i = 0; i < TCOUNT; i++) {
sem_wait(&sem);
count++;
sem_post(&sem);
printf("In Dum(). Count :: %d. Thread :: %ld \n", count, id);
}
pthread_exit(NULL);
}
int main (int argc, char *argv[]) {
int i;
long t1=1, t2=2;
sem_init(&sem, 0, 1);
pthread_t threads[NUM_THREADS];
pthread_create(&threads[1], NULL, dum, (void *)t1);
pthread_create(&threads[2], NULL, dum, (void *) t2);
for (i=1; i<=2; i++) {
pthread_join(threads[i], NULL);
}
printf ("Main(): Waited on %d threads. Done.\n", NUM_THREADS);
printf ("Count should be 12. Actual Count: %d. \n", count);
pthread_exit(NULL);
}
输出:
In Dum(). Count :: 1. Thread :: 1
In Dum(). Count :: 2. Thread :: 1
In Dum(). Count :: 3. Thread :: 1
In Dum(). Count :: 4. Thread :: 1
In Dum(). Count :: 5. Thread :: 1
In Dum(). Count :: 6. Thread :: 1
In Dum(). Count :: 7. Thread :: 1
In Dum(). Count :: 8. Thread :: 1
In Dum(). Count :: 9. Thread :: 1
In Dum(). Count :: 10. Thread :: 1
In Dum(). Count :: 11. Thread :: 1
In Dum(). Count :: 13. Thread :: 1
In Dum(). Count :: 13. Thread :: 2
In Dum(). Count :: 14. Thread :: 2
In Dum(). Count :: 15. Thread :: 2
In Dum(). Count :: 16. Thread :: 2
In Dum(). Count :: 17. Thread :: 2
In Dum(). Count :: 18. Thread :: 2
In Dum(). Count :: 19. Thread :: 2
In Dum(). Count :: 20. Thread :: 2
In Dum(). Count :: 21. Thread :: 2
In Dum(). Count :: 22. Thread :: 2
In Dum(). Count :: 23. Thread :: 2
In Dum(). Count :: 24. Thread :: 2
Main(): Waited on 2 threads. Done.
Count should be 12. Actual Count: 24.
【问题讨论】:
-
顺便说一句,你的程序中有一个错误...你需要使用索引 0 和 1 而不是 1 和 2。你很幸运,它不是崩溃,尽管它可能会导致您出现不可预知的行为。
-
无关:
long id = long(t_id);?也许我的 C 编译器有点太古老了。我是否错过了另一个备忘录,因为编译 C11 的 clang 3.8 对此感到厌烦。 -
相关:您有两个线程被硬编码为循环 12 次迭代每个。一种或另一种方式,只要你的信号量完成它的工作,你最终会在两者之间总共有 24 个增量。如果这不是您想要的,那么代码是错误的。提示:
COUNT_LIMIT的定义可疑,但在发布的代码中完全未使用。 -
程序几乎按原样运行(输出方面),您将
i计数到12两次,所以count将是i*2或24 -
@Serdalis:如何使用信号量让两个线程只运行到 12 个?