File: pth_once.c

package info (click to toggle)
valgrind 1:3.12.0~svn20160714-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 120,428 kB
  • ctags: 70,855
  • sloc: ansic: 674,645; exp: 26,134; xml: 21,574; asm: 7,570; cpp: 7,567; makefile: 7,380; sh: 6,188; perl: 5,855; haskell: 195
file content (81 lines) | stat: -rw-r--r-- 1,984 bytes parent folder | download | duplicates (10)
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
/********************************************************
 * An example source module to accompany...
 *
 * "Using POSIX Threads: Programming with Pthreads"
 *     by Brad nichols, Dick Buttlar, Jackie Farrell
 *     O'Reilly & Associates, Inc.
 *
 ********************************************************
 * once_exam.c
 *
 * An example of using the pthreads_once() call to execute an
 * initialization procedure.
 *
 * A program spawns multiple threads and each one tries to
 * execute the routine welcome() using the once call. Only
 * the first thread into the once routine will actually
 * execute welcome().
 *
 * The program's main thread synchronizes its exit with the
 * exit of the threads using the pthread_join() operation.
 *
*/

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>

#include <pthread.h>

#define  NUM_THREADS   10

static pthread_once_t welcome_once_block = PTHREAD_ONCE_INIT;

void welcome(void)
{
	printf("welcome: Welcome\n");
}

void *identify_yourself(void *arg)
{
	int rtn;

	if ((rtn = pthread_once(&welcome_once_block,
			        welcome)) != 0) {
		fprintf(stderr, "pthread_once failed with %d",rtn);
		pthread_exit((void *)NULL);
	}
	printf("identify_yourself: Hi, I'm a thread\n");
        return(NULL);
}

extern int
main(void)
{
	int             *id_arg, thread_num, rtn;
	pthread_t       threads[NUM_THREADS];

	id_arg = (int *)malloc(NUM_THREADS*sizeof(int));

	for (thread_num = 0; thread_num < NUM_THREADS; (thread_num)++) {

		id_arg[thread_num] = thread_num;

		if (( rtn = pthread_create(&threads[thread_num], 
					   NULL,
					   identify_yourself,
					   (void *) &(id_arg[thread_num]))) 
		    != 0) {
		  fprintf(stderr, "pthread_create failed with %d",rtn);
		  exit(1);
		}
	} 	

	for (thread_num = 0; thread_num < NUM_THREADS; thread_num++) {
	  pthread_join(threads[thread_num], NULL);
	  //printf("main: joined to thread %d\n", thread_num);
	}
	printf("main: Goodbye\n");
        return 0;
}