File: pth_cvsimple.c

package info (click to toggle)
valgrind 1%3A3.24.0-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 176,332 kB
  • sloc: ansic: 795,029; exp: 26,134; xml: 23,472; asm: 14,393; cpp: 9,397; makefile: 7,464; sh: 6,122; perl: 5,446; python: 1,498; javascript: 981; awk: 166; csh: 1
file content (92 lines) | stat: -rw-r--r-- 2,271 bytes parent folder | download | duplicates (11)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/********************************************************
 * An example source module to accompany...
 *
 * "Using POSIX Threads: Programming with Pthreads"
 *     by Brad nichols, Dick Buttlar, Jackie Farrell
 *     O'Reilly & Associates, Inc.
 *
 ********************************************************
 *
 * cvsimple.c
 *
 * Demonstrates pthread condvars.
 *
 */
#include <unistd.h>
#include <stdio.h>
#include <pthread.h>

#define NUM_THREADS  3
#define TCOUNT 10
#define COUNT_THRES 12

int     condvar_was_hit = 0;
int     count = 0;
int     thread_ids[3] = {0,1,2};
pthread_mutex_t count_lock=PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t count_hit_threshold=PTHREAD_COND_INITIALIZER; 

void *inc_count(void *null)
{
  int i=0;

  for (i=0; i<TCOUNT; i++) {
    pthread_mutex_lock(&count_lock);
    count++;
    printf("inc_counter(): count = %d, unlocking mutex\n", count);
    if (count == COUNT_THRES) {
      printf("hit threshold!\n");
      pthread_cond_signal(&count_hit_threshold);
    }
    pthread_mutex_unlock(&count_lock);
  }
  
  return(NULL);
}

void *watch_count(void *null)
{
  pthread_mutex_lock(&count_lock);

  while (count < COUNT_THRES) {
    pthread_cond_wait(&count_hit_threshold, &count_lock);
    condvar_was_hit = 1;
  }

  pthread_mutex_unlock(&count_lock);
  
  return(NULL);
}

extern int
main(void)
{
  int       i;
  pthread_t threads[3];

  pthread_create(&threads[0], NULL, watch_count, NULL);
  sleep(1);
  pthread_create(&threads[1], NULL, inc_count,   NULL);
  pthread_create(&threads[2], NULL, inc_count,   NULL);

  for (i = 0; i < NUM_THREADS; i++) {
    pthread_join(threads[i], NULL);
  }

  // Nb: it's not certain that we'll hit here.  It's possible that the two
  // inc_count threads could fully run before watch_count begins, and so
  // pthread_cond_wait() is never called.  Or, we could get a spurious
  // wake-up in watch_count().  Nonetheless, it's very likely that things
  // will work out as expected, since we're starting watch_count() first.
  // (Also since the sleep() call was added after watch_count()!)
  if (condvar_was_hit == 1)
    printf("condvar was hit!\n");
  else if (condvar_was_hit > 1)
    printf("condvar was multi-hit...\n");
  else
    printf("condvar was missed...\n");
  
  return 0;
}