gcc -o code13 code13.c -lpthread /* libpthread as a part of Unix/Linux operating systems */ ./code13
1 /*******************************************************************
2 * FILE: hello.c
3 * DESCRIPTION:
4 * A "hello world" Pthreads program. Demonstrates thread creation and
5 * termination.
6 * AUTHOR: Blaise Barney
7 * LAST REVISED: 08/09/11
8 ******************************************************************* */
9 #include <pthread.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <unistd.h>
13
14 #define NUM_THREADS 5
15
16 void *PrintHello(void *threadid)
17 {
18 sleep(10);
19 long tid;
20 tid = (long)threadid;
21 printf("Hello World! It's me, thread #%ld!\n", tid);
22 pthread_exit(NULL);
23 }
24
25 int main(int argc, char *argv[])
26 {
27 pthread_t threads[NUM_THREADS];
28 int rc;
29 long t;
30 for(t=0;t<NUM_THREADS;t++){
31 printf("In main: creating thread %ld\n", t);
32 rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
33 if (rc){
34 printf("ERROR; return code from pthread_create() is %d\n", rc);
35 exit(-1);
36 }
37 }
38
39 /* Last thing that main() should do */
40 pthread_exit(NULL);
41 }
|
gcc -o code14 code14.c -lpthread ./code14
1 /*******************************************************************
2 * FILE: hello_arg1.c
3 * DESCRIPTION:
4 * A "hello world" Pthreads program which demonstrates one safe way
5 * to pass arguments to threads during thread creation.
6 * AUTHOR: Blaise Barney
7 * LAST REVISED: 08/04/15
8 ******************************************************************* */
9 #include <pthread.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <unistd.h>
13
14 #define NUM_THREADS 8
15 char *messages[NUM_THREADS];
16
17 void *PrintHello(void *threadid)
18 {
19 sleep(1);
20 long taskid;
21 taskid = (long) threadid;
22 printf("Thread %ld: %s\n", taskid, messages[taskid]);
23 pthread_exit(NULL);
24 }
25
26 int main(int argc, char *argv[])
27 {
28 pthread_t threads[NUM_THREADS];
29 long taskids[NUM_THREADS];
30 int rc, t;
31
32 messages[0] = "English: Hello World!";
33 messages[1] = "French: Bonjour, le monde!";
34 messages[2] = "Spanish: Hola al mundo";
35 messages[3] = "Klingon: Nuq neH!";
36 messages[4] = "German: Guten Tag, Welt!";
37 messages[5] = "Russian: Zdravstvuyte, mir!";
38 messages[6] = "Japan: Sekai e konnichiwa!";
39 messages[7] = "Latin: Orbis, te saluto!";
40
41 for(t=0;t<NUM_THREADS;t++) {
42 taskids[t] = t;
43 printf("Creating thread %d\n", t);
44 rc = pthread_create(&threads[t], NULL, PrintHello, (void *) taskids[t]);
45 if (rc) {
46 printf("ERROR; return code from pthread_create() is %d\n", rc);
47 exit(-1);
48 }
49 }
50
51 pthread_exit(NULL);
52 }
|
gcc -o code15 code15.c -lpthread ./code15
1 /*******************************************************************
2 * FILE: hello_arg2.c
3 * DESCRIPTION:
4 * A hello world Pthreads program which demonstrates another safe way
5 * to pass arguments to threads during thread creation. In this case,
6 * a structure is used to pass multiple arguments.
7 * AUTHOR: Blaise Barney
8 * LAST REVISED: 01/29/09
9 ******************************************************************* */
10 #include <pthread.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <unistd.h>
14
15 #define NUM_THREADS 8
16
17 char *messages[NUM_THREADS];
18
19 struct thread_data
20 {
21 int thread_id;
22 int sum;
23 char *message;
24 };
25
26 struct thread_data thread_data_array[NUM_THREADS];
27
28 void *PrintHello(void *threadarg)
29 {
30 // sleep(1);
31 int taskid, sum;
32 char *hello_msg;
33 struct thread_data *my_data;
34
35 sleep(1);
36 my_data = (struct thread_data *) threadarg;
37 taskid = my_data->thread_id;
38 sum = my_data->sum;
39 hello_msg = my_data->message;
40 printf("Thread %d: %s Sum=%d\n", taskid, hello_msg, sum);
41 pthread_exit(NULL);
42 }
43
44 int main(int argc, char *argv[])
45 {
46 pthread_t threads[NUM_THREADS];
47 int *taskids[NUM_THREADS];
48 int rc, t, sum;
49
50 sum=0;
51 messages[0] = "English: Hello World!";
52 messages[1] = "French: Bonjour, le monde!";
53 messages[2] = "Spanish: Hola al mundo";
54 messages[3] = "Klingon: Nuq neH!";
55 messages[4] = "German: Guten Tag, Welt!";
56 messages[5] = "Russian: Zdravstvytye, mir!";
57 messages[6] = "Japan: Sekai e konnichiwa!";
58 messages[7] = "Latin: Orbis, te saluto!";
59
60 for(t=0;t<NUM_THREADS;t++) {
61 sum = sum + t;
62 thread_data_array[t].thread_id = t;
63 thread_data_array[t].sum = sum;
64 thread_data_array[t].message = messages[t];
65 printf("Creating thread %d\n", t);
66 rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &thread_data_array[t]);
67
68 if (rc) {
69 printf("ERROR; return code from pthread_create() is %d\n", rc);
70 exit(-1);
71 }
72 }
73
74 pthread_exit(NULL);
75 }
|
gcc -o code16 code16.c -lpthread ./code16
1 /*******************************************************************
2 * FILE: bug3.c
3 * DESCRIPTION:
4 * This "hello world" Pthreads program demonstrates an unsafe (incorrect)
5 * way to pass thread arguments at thread creation. Compare with hello_arg1.c.
6 * In this case, the argument variable is changed by the main thread as it
7 * creates new threads.
8 * AUTHOR: Blaise Barney
9 * LAST REVISED: 07/16/14
10 ******************************************************************* */
11 #include <pthread.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <unistd.h>
15
16 #define NUM_THREADS 8
17 void *PrintHello(void *threadid)
18 {
19 // sleep(1);
20 long taskid;
21 taskid = *(long *)threadid;
22 printf("Hello from thread %ld\n", taskid);
23 pthread_exit(NULL);
24 }
25
26 int main(int argc, char *argv[])
27 {
28 pthread_t threads[NUM_THREADS];
29 int rc;
30 long t;
31
32 for(t=0;t<NUM_THREADS;t++) {
33 printf("Creating thread %ld\n", t);
34 rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &t);
35 if (rc) {
36 printf("ERROR; return code from pthread_create() is %d\n", rc);
37 exit(-1);
38 }
39 }
40 pthread_exit(NULL);
41 }
|
gcc -o code17 code17.c -lpthread -lm
1 /*******************************************************************
2 * FILE: join.c
3 * DESCRIPTION:
4 * This example demonstrates how to "wait" for thread completions by
5 * using the Pthread join routine. Threads are explicitly created in
6 * a joinable state for portability reasons. Use of the pthread_exit
7 * status argument is also shown.
8 * AUTHOR: 8/98 Blaise Barney
9 * LAST REVISED: 01/30/09
10 ******************************************************************* */
11 #include <pthread.h>
12 #include <stdio.h>
13 #include <stdlib.h>
14 #include <math.h>
15 #include <unistd.h>
16
17 #define NUM_THREADS 4
18 void *BusyWork(void *t)
19 {
20 // sleep(1);
21 int i;
22 long tid;
23 double result=0.0;
24 tid = (long)t;
25 printf("Thread %ld starting...\n",tid);
26 for (i=0; i<1000000; i++)
27 {
28 result = result + sin(i) * tan(i);
29 }
30 printf("Thread %ld done. Result = %e\n",tid, result);
31 pthread_exit((void*) t);
32 }
33
34 int main (int argc, char *argv[])
35 {
36 pthread_t thread[NUM_THREADS];
37 pthread_attr_t attr;
38 int rc;
39 long t;
40 void *status;
41 /* Initialize and set thread detached attribute */
42 pthread_attr_init(&attr);
43 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
44
45 for(t=0; t<NUM_THREADS; t++) {
46 printf("Main: creating thread %ld\n", t);
47 rc = pthread_create(&thread[t], &attr, BusyWork, (void *)t);
48 if (rc) {
49 printf("ERROR; return code from pthread_create() is %d\n", rc);
50 exit(-1);
51 }
52 }
|