我已經在C語言中成功實現了Mutex鎖定和條件變量鎖定,並試圖使用信號量來實現相同的功能。下面是我的代碼,但執行時,輸出始終爲24而不是12.請幫助我理解如何使用信號量。理解C語言中的信號量
#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.你很幸運沒有崩潰,儘管它可能會導致你不可預測行爲。 – kcraigie
無關:'long id = long(t_id);'?也許我的C編譯器有點古老。我錯過了另一個備忘錄,因爲叮噹3.8編譯C11嘔吐。 – WhozCraig
相關:你有兩個硬編碼的線程循環12次迭代**每個**。不管怎樣,只要你的信號量完成了它的工作,你最終將在兩者之間總共增加24個。如果這不是你想要的,那麼代碼是錯誤的。提示:'COUNT_LIMIT'是可疑定義的,但在發佈的代碼中完全沒有使用。 – WhozCraig