C有关线程锁和条件变量的问题

问题描述 投票:0回答:1

我不太清楚这段代码要做什么。我对此代码有一些疑问。 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;
}
c multithreading operating-system locking condition-variable
1个回答
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功能中将TCOUNTCOUNT_LIMIT进行检查也没有意义。 for循环将始终在您达到COUNT_LIMIT限制之前结束。

无论如何,此刻每个inc_count功能有10个锁和10个解锁+ watch_count功能有1个锁和1个解锁。当计数等于12时,仅使用此TCOUNTCOUNT_LIMIT发出一次条件变量信号。

© www.soinside.com 2019 - 2024. All rights reserved.