-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy paththr3.cpp
More file actions
84 lines (62 loc) · 1.66 KB
/
thr3.cpp
File metadata and controls
84 lines (62 loc) · 1.66 KB
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
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
struct Cond
{
pthread_mutex_t m;
pthread_cond_t c;
};
void* thr(void *pArg)
{
// printf("starting wait..\n");
struct Cond *pCond = static_cast<Cond*>(pArg);
pthread_cond_wait(&pCond->c, &pCond->m);
// printf("wait stopped\n");
return (void*)5;
}
void* thr2(void *pArg)
{
printf("waiting for barrier (thr)\n");
pthread_barrier_wait(static_cast<pthread_barrier_t*>(pArg));
printf("barrier received (thr)\n");
return (void*)6;
}
int main(int argc, char **argv)
{
pid_t pid = getpid();
FILE *f = fopen("/home/box/main.pid", "w");
if( f == NULL ) {printf("fopen err"); return -1;}
if(fprintf(f, "%ld\n", (long)pid) < 0) { printf("err fprintf\n"); return -1;}
Cond cond;
cond.c = PTHREAD_COND_INITIALIZER;
cond.m = PTHREAD_MUTEX_INITIALIZER;
pthread_t id;
if( pthread_create(&id, nullptr, thr, &cond) != 0 )
{ printf("pthread_create err\n"); return -1; }
pthread_t id2;
pthread_barrier_t b;
pthread_barrier_init(&b, NULL, 2);
if( pthread_create(&id2, nullptr, thr2, &b) != 0 )
{ printf("pthread_create 2 err\n"); return -1; }
pause();
// printf("sleeping...\n");
// sleep(2);
// printf("signalling...\n");
// do signal
pthread_cond_signal(&cond.c);
void *res;
if( pthread_join(id, &res) != 0 )
{ printf("pthread_join err\n"); return -1; }
pthread_mutex_destroy(&cond.m);
pthread_cond_destroy(&cond.c);
// printf("waiting for barrier (main)\n");
// sleep(2);
pthread_barrier_wait(&b);
// printf("barrier rcvd (main)\n");
pthread_barrier_destroy(&b);
//2nd thread
if( pthread_join(id2, &res) != 0 )
{ printf("pthread_join 2 err\n"); return -1; }
printf("thread joined\n");
return 0;
}