pthread condition mutex

来源:互联网 发布:mac深圳 编辑:程序博客网 时间:2024/05/09 07:02
#include <stdio.h>#include <stdlib.h>#include <pthread.h>#define NUM_THREADS 3#define TCOUNT 10#define COUNT_LIMIT 12int count = 0;int thread_ids[3] = {0,1,2};pthread_mutex_t count_mutex;pthread_cond_t count_threshold_cv;void* inc_count(void *t){               int i;        long my_id = (long)t;        for(i=0; i<TCOUNT; i++)        {                       pthread_mutex_lock(&count_mutex);                count++;                                if(count == COUNT_LIMIT)                {                               pthread_cond_signal(&count_threshold_cv);                        printf("inc_count(): thread %ld, count = %d Threshold reached.\n",                                        my_id, count);                }                                printf("inc_count(): thread %ld , count = %d, unlocking mutex\n",                                my_id, count);                pthread_mutex_unlock(&count_mutex);                                sleep(1);        }                pthread_exit(NULL);}void *watch_count(void *t) {        long my_id = (long)t;        printf("Starting watch_count(): thread %ld\n", my_id);            pthread_mutex_lock(&count_mutex);        while(count<COUNT_LIMIT)        {                   pthread_cond_wait(&count_threshold_cv, &count_mutex);                   printf("watch_count(): thread %ld Condition signal received.\n", my_id);                count += 125;                printf("watch_count(): thread %ld count now = %d.\n", my_id, count);        }           pthread_mutex_unlock(&count_mutex);        pthread_exit(NULL);}int main(){        int i, rc;        long 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_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);        pthread_create(&threads[0], &attr, watch_count, (void*)t1);        pthread_create(&threads[1], &attr, inc_count, (void*)t2);        pthread_create(&threads[2], &attr, inc_count, (void*)t3);        for(i=0; i<NUM_THREADS; i++)        {                pthread_join(threads[i], NULL);        }        printf("Main(): Waited on %d threads, Done\n", NUM_THREADS);        pthread_attr_destroy(&attr);        pthread_mutex_destroy(&count_mutex);        pthread_cond_destroy(&count_threshold_cv);        pthread_exit(NULL);        return 0;}
inc_count(): thread 3 , count = 1, unlocking mutexinc_count(): thread 2 , count = 2, unlocking mutexStarting watch_count(): thread 1inc_count(): thread 3 , count = 3, unlocking mutexinc_count(): thread 2 , count = 4, unlocking mutexinc_count(): thread 3 , count = 5, unlocking mutexinc_count(): thread 2 , count = 6, unlocking mutexinc_count(): thread 3 , count = 7, unlocking mutexinc_count(): thread 2 , count = 8, unlocking mutexinc_count(): thread 3 , count = 9, unlocking mutexinc_count(): thread 2 , count = 10, unlocking mutexinc_count(): thread 3 , count = 11, unlocking mutexinc_count(): thread 2, count = 12 Threshold reached.inc_count(): thread 2 , count = 12, unlocking mutexwatch_count(): thread 1 Condition signal received.watch_count(): thread 1 count now = 137.inc_count(): thread 3 , count = 138, unlocking mutexinc_count(): thread 2 , count = 139, unlocking mutexinc_count(): thread 3 , count = 140, unlocking mutexinc_count(): thread 2 , count = 141, unlocking mutexinc_count(): thread 3 , count = 142, unlocking mutexinc_count(): thread 2 , count = 143, unlocking mutexinc_count(): thread 3 , count = 144, unlocking mutexinc_count(): thread 2 , count = 145, unlocking mutexMain(): Waited on 3 threads, Done


0 0
原创粉丝点击