我不太清楚这段代码要做什么。我对此代码有一些疑问。 count
线程打印的watch_count
变量值是什么? count
打印的main
变量值是什么?总共有多少个锁定和解锁操作?我认为40岁,但不确定。我试图运行此代码,但它不是确定性的。关于此代码的用途,我是否无法理解或存在一些错误?请帮我。
#include <stdio.h>
#include <pthread.h>
#define NUM_THREADS 3
#define TCOUNT 10
#define COUNT_LIMIT 12
int count=0;
pthread_mutex_t count_mutex;
pthread_cond_t count_threshold_cv;
void *inc_count(void *t){
int j,i;
double result=0.0;
for(i=0;i<TCOUNT;i++){
pthread_mutex_lock(&count_mutex);
count++;
if(count==COUNT_LIMIT){
pthread_cond_signal(&count_threshold_cv);
printf("Just sent signal.\n");
}
pthread_mutex_unlock(&count_mutex);
}
pthread_exit(NULL);
}
void *watch_count(void *t){
int my_id = (int)t;
pthread_mutex_lock(&count_mutex);
while(count<COUNT_LIMIT){
pthread_cond_wait(&count_threshold_cv,&count_mutex);
printf("watch_count(): thread %d Condition signal received.\n",my_id);
count+=125;
printf("watch_count(): thread %d count now=%d.\n",my_id,count);
}
pthread_mutex_unlock(&count_mutex);
pthread_exit(NULL);
}
int main() {
int i,rc,t1=1,t2=2,t3=3;
pthread_t threads[3];
pthread_attr_t attr;
pthread_mutex_init(&count_mutex,NULL);
pthread_cond_init(&count_threshold_cv,NULL);
pthread_attr_init(&attr);
pthread_create(&threads[0],&attr,inc_count,(void *)t1);
pthread_create(&threads[1],&attr,inc_count,(void *)t2);
pthread_create(&threads[2],&attr,watch_count,(void *)t3);
for(i=0;i<NUM_THREADS;i++){
pthread_join(threads[i],NULL);
}
printf("Main(): Waited on %d threads. Final value of count=%d. Done.\n",NUM_THREADS,count);
pthread_exit(NULL);
return 0;
}
如果您要在没有启动同步的情况下启动线程,例如信号量或其他条件变量,请尝试先启动第三个(正在等待的)线程。
线程速度问题。第一个和第二个线程执行和退出的速度过快,每个线程将count增加10,然后计数变为20。当第三个线程启动时,只是不要进入while
循环,因为count
(20)不会小于COUNT_LIMIT
(12)。
我已经在计算机上测试了此代码,并按原始顺序测试了结果:
$ ./test
Just sent signal.
Main(): Waited on 3 threads. Final value of count=20. Done.
更改开始顺序后的结果:
$ ./test
Just sent signal.
watch_count(): thread 3 Condition signal received.
watch_count(): thread 3 count now=145.
Main(): Waited on 3 threads. Final value of count=145. Done.
[此外,因为count
小于COUNT_LIMIT
,所以在inc_count
功能中将TCOUNT
与COUNT_LIMIT
进行检查也没有意义。 for
循环将始终在您达到COUNT_LIMIT
限制之前结束。
无论如何,此刻每个inc_count
功能有10个锁和10个解锁+ watch_count
功能有1个锁和1个解锁。当计数等于12时,仅使用此TCOUNT
和COUNT_LIMIT
发出一次条件变量信号。