35threads4 - brown university · 2019. 11. 24. · cs33 intro to computer systems xxxv–14...
TRANSCRIPT
![Page 1: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/1.jpg)
CS33 Intro to Computer Systems XXXV–1 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
CS 33Multithreaded Programming IV
![Page 2: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/2.jpg)
CS33 Intro to Computer Systems XXXV–2 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Tree
-1
6
4 9
1 5 8 11
![Page 3: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/3.jpg)
CS33 Intro to Computer Systems XXXV–3 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Tree: Insertion
-1
6
4 9
1 5 8 11
7
7
![Page 4: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/4.jpg)
CS33 Intro to Computer Systems XXXV–4 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Tree: Deletion of Leaf
-1
6
4 9
1 5 8 11
7
![Page 5: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/5.jpg)
CS33 Intro to Computer Systems XXXV–5 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Tree: Deletion of Leaf
-1
6
4 9
1 5 8
7
![Page 6: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/6.jpg)
CS33 Intro to Computer Systems XXXV–6 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Tree: Deletion of Node with One Child
-1
6
4 9
1 5
7
8
![Page 7: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/7.jpg)
CS33 Intro to Computer Systems XXXV–7 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Tree: Deletion of Node with One Child
-1
6
4 9
1 5
7
![Page 8: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/8.jpg)
CS33 Intro to Computer Systems XXXV–8 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Tree: Deletion of Node with Two Children
-1
6
4 9
1 5 8
7
X:
Y:
![Page 9: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/9.jpg)
CS33 Intro to Computer Systems XXXV–9 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Tree: Deletion of Node with Two Children
-1
7
4 9
1 5 8
Y:
![Page 10: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/10.jpg)
CS33 Intro to Computer Systems XXXV–10 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
C Code: Search
Node *search(int key,Node *parent, Node **parentp) {
Node *next;Node *result;if (key < parent->key) {
if ((next = parent->lchild)== 0) {
result = 0;} else {
if (key == next->key) {result = next;
} else {result = search(key,
next, parentpp);return result;
}}
} else {if ((next = parent->rchild)
== 0) {result = 0;
} else {if (key == next->key) {
result = next;} else {
result = search(key,next, parentpp);
return result;}
}}if (parentpp != 0)
*parentpp = parent;return result;
}
![Page 11: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/11.jpg)
CS33 Intro to Computer Systems XXXV–11 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
C Code: Add
int add(int key) {Node *parent, *target, *newnode;if ((target = search(key, &head, &parent)) != 0) {
return 0;}newnode = malloc(sizeof(Node));newnode->key = key;newnode->lchild = newnode->rchild = 0;if (name < parent->name)
parent->lchild = newnode;else
parent->rchild = newnode;return 1;
}
![Page 12: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/12.jpg)
CS33 Intro to Computer Systems XXXV–12 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Readers-Writers API
int pthread_rwlock_init(pthread_rwlock_t *lock,pthread_rwlockattr_t *att);
int pthread_rwlock_destroy(pthread_rwlock_t *lock);
int pthread_rwlock_rdlock(pthread_rwlock_t *lock);
int pthread_rwlock_wrlock(pthread_rwlock_t *lock);
int pthread_rwlock_tryrdlock(pthread_rwlock_t *lock);
int pthread_rwlock_trywrlock(pthread_rwlock_t *lock);
int pthread_timedrwlock_rdlock(pthread_rwlock_t *lock, struct timespec *ts);
int pthread_timedrwlock_wrlock(pthread_rwlock_t *lock, struct timespec *ts);
int pthread_rwlock_unlock(pthread_rwlock_t *lock);
![Page 13: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/13.jpg)
CS33 Intro to Computer Systems XXXV–13 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Treewith Coarse-Grained Synchronization
-1
6
4 9
1 5 8 11
![Page 14: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/14.jpg)
CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
C Code: Add with Coarse-Grained Synchronization
int add(int key) {Node *parent, *target, *newnode;pthread_rwlock_wrlock(&tree_lock);if ((target = search(key, &head, &parent)) != 0) {
pthread_rwlock_unlock(&tree_lock);return 0;
}newnode = malloc(sizeof(Node));newnode->key = key;newnode->lchild = newnode->rchild = 0;if (name < parent->name)
parent->lchild = newnode;else
parent->rchild = newnode;pthread_rwlock_unlock(&tree_lock);return 1;
}
![Page 15: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/15.jpg)
CS33 Intro to Computer Systems XXXV–15 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Treewith Fine-Grained Synchronization I
-1
6
4 9
1 5 8 11
![Page 16: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/16.jpg)
CS33 Intro to Computer Systems XXXV–16 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Treewith Fine-Grained Synchronization II
-1
6
4 9
1 5 8 11
![Page 17: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/17.jpg)
CS33 Intro to Computer Systems XXXV–17 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Binary Search Treewith Fine-Grained Synchronization III
-1
4
1 5
?
![Page 18: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/18.jpg)
CS33 Intro to Computer Systems XXXV–18 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Doing It Right …
-1
6
4 9
1 5 8 11
![Page 19: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/19.jpg)
CS33 Intro to Computer Systems XXXV–19 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
C Code: Fine-Grained Search I
enum locktype {l_read, l_write};
#define lock(lt, lk) ((lt) == l_read)?pthread_rwlock_rdlock(lk):
pthread_rwlock_wrlock(lk)
Node *search(int key,
Node *parent, Node **parentp,
enum locktype lt) {// parent is locked on entry
Node *next;
Node *result;if (key < parent->key) {
if ((next = parent->lchild)
== 0) {result = 0;
} else {lock(lt, &next->lock);
if (key == next->key) {result = next;
} else {
pthread_rwlock_unlock(&parent->lock);
result = search(key,
next, parentpp, lt);return result;
}
}
![Page 20: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/20.jpg)
CS33 Intro to Computer Systems XXXV–20 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
C Code: Fine-Grained Search II
} else {if ((next = parent->rchild)
== 0) {result = 0;
} else {lock(lt, &next->lock);if (key == next->key) {
result = next;
} else {pthread_rwlock_unlock(
&parent->lock);result = search(key,
next, parentpp, lt);return result;
}}
}if (parentpp != 0) {
// parent remains locked*parentpp = parent;
} elsepthread_rwlock_unlock(
&parent->lock);return result;
}
![Page 21: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/21.jpg)
CS33 Intro to Computer Systems XXXV–21 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
C Code: Add with Fine-Grained Synchronization I
int add(int key) {Node *parent, *target, *newnode;pthread_rwlock_wrlock(&head->lock);if ((target = search(key, &head, &parent,
l_write)) != 0) {pthread_rwlock_unlock(&target->lock);pthread_rwlock_unlock(&parent->lock);return 0;
}
![Page 22: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/22.jpg)
CS33 Intro to Computer Systems XXXV–22 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
C Code: Add with Fine-Grained Synchronization II
newnode = malloc(sizeof(Node));newnode->key = key;newnode->lchild = newnode->rchild = 0;pthread_rwlock_init(&newnode->lock, 0);if (name < parent->name)
parent->lchild = newnode;else
parent->rchild = newnode;pthread_rwlock_unlock(&parent->lock);return 1;
}
![Page 23: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/23.jpg)
CS33 Intro to Computer Systems XXXV–23 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Barriers
![Page 24: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/24.jpg)
CS33 Intro to Computer Systems XXXV–24 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
A Solution?
pthread_mutex_lock(&m);if (++count == number) {pthread_cond_broadcast(&cond_var);
} else while (!(count == number)) {pthread_cond_wait(&cond_var, &m);
}pthread_mutex_unlock(&m);
![Page 25: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/25.jpg)
CS33 Intro to Computer Systems XXXV–25 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
How About This?
pthread_mutex_lock(&m);if (++count == number) {pthread_cond_broadcast(&cond_var);count = 0;
} else while (!(count == number)) {
pthread_cond_wait(&cond_var, &m);}pthread_mutex_unlock(&m);
![Page 26: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/26.jpg)
CS33 Intro to Computer Systems XXXV–26 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
And This ...
pthread_mutex_lock(&m);if (++count == number) {pthread_cond_broadcast(&cond_var);count = 0;
} else {pthread_cond_wait(&cond_var, &m);
}pthread_mutex_unlock(&m);
Quiz 1Does it work?
a) definitelyb) probablyc) rarelyd) never
![Page 27: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/27.jpg)
CS33 Intro to Computer Systems XXXV–27 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Barrier in POSIX Threads
pthread_mutex_lock(&m);if (++count < number) {int my_generation = generation;while(my_generation == generation) {pthread_cond_wait(&waitQ, &m);
}} else {count = 0;generation++;pthread_cond_broadcast(&waitQ);
}pthread_mutex_unlock(&m);
![Page 28: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/28.jpg)
CS33 Intro to Computer Systems XXXV–28 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
More From POSIX!
int pthread_barrier_init(pthread_barrier_t *barrier,
pthread_barrierattr_t *attr,
unsigned int count);
int pthread_barrier_destroy(
pthread_barrier_t *barrier);
int pthread_barrier_wait(
pthread_barrier_t *barrier);
![Page 29: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/29.jpg)
CS33 Intro to Computer Systems XXXV–29 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Why cond_wait is Weird …
pthread_cond_wait(pthread_cond_t *c, pthread_mutex_t *m) {
pthread_mutex_unlock(m);
sem_wait(c->sem);pthread_mutex_lock(m);
}
pthread_cond_signal(pthread_cond_t *c) {sem_post(c->sem);
}
![Page 30: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/30.jpg)
CS33 Intro to Computer Systems XXXV–30 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Deviations
• Signals
• Cancellation– tamed lightning
vs.
![Page 31: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/31.jpg)
CS33 Intro to Computer Systems XXXV–31 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Signals
•
– who gets them?– who needs them?
•
– how do you respond to them?
![Page 32: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/32.jpg)
CS33 Intro to Computer Systems XXXV–32 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Dealing with Signals
• Per-thread signal masks• Per-process signal vectors• One delivery per signal
![Page 33: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/33.jpg)
CS33 Intro to Computer Systems XXXV–33 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Signals and Threads
int pthread_kill(pthread_t thread, int signo);
– thread equivalent of kill
int pthread_sigmask(int how,const sigset_t *newmask,sigset_t oldmask);
– thread equivalent of sigprocmask
![Page 34: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/34.jpg)
CS33 Intro to Computer Systems XXXV–34 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Asynchronous Signals (1)
int main( ) {void handler(int);signal(SIGINT, handler);
...
}
void handler(int sig) {
...}
![Page 35: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/35.jpg)
CS33 Intro to Computer Systems XXXV–35 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Asynchronous Signals (2)
int main( ) {void handler(int);
signal(SIGINT, handler);
... // complicated program
printf("important message: ""%s\n", message);
... // more program
}
void handler(int sig) {
... // deal with signal
printf("equally important ""message: %s\n", message);
}
![Page 36: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/36.jpg)
CS33 Intro to Computer Systems XXXV–36 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Quiz 2
int main( ) {void handler(int);
signal(SIGINT, handler);
... // complicated program
pthread_mutex_lock(&mut);printf("important message: "
"%s\n", message);pthread_mutex_unlock(&mut);
... // more program
}
void handler(int sig) {
... // deal with signal
pthread_mutex_lock(&mut);printf("equally important "
"message: %s\n", message);pthread_mutex_unlock(&mut);
}
Does this work?a) yesb) no
![Page 37: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/37.jpg)
CS33 Intro to Computer Systems XXXV–37 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Synchronizing Asynchrony
computation_state_t state;sigset_t set;
int main( ) {pthread_t thread;
sigemptyset(&set);sigaddset(&set, SIGINT);pthread_sigmask(SIG_BLOCK,&set, 0);
pthread_create(&thread, 0,monitor, 0);
long_running_procedure( );}
void *monitor(void *dummy) {int sig;while (1) {sigwait(&set, &sig);display(&state);
}return(0);
}
![Page 38: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/38.jpg)
CS33 Intro to Computer Systems XXXV–38 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Cancellation
![Page 39: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/39.jpg)
CS33 Intro to Computer Systems XXXV–39 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Sample Code
void *thread_code(void *arg) {
node_t *head = 0;
while (1) {node_t *nodep;
nodep = (node_t *)malloc(sizeof(node_t));if (read(0, &node->value,
sizeof(node->value)) == 0) {free(nodep);
break;}nodep->next = head;
head = nodep;
}
return head;}
pthread_cancel(thread);
![Page 40: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/40.jpg)
CS33 Intro to Computer Systems XXXV–40 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Cancellation Concerns
• Getting cancelled at an inopportune moment• Cleaning up
![Page 41: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/41.jpg)
CS33 Intro to Computer Systems XXXV–41 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Cancellation State
• Pending cancel– pthread_cancel(thread)
• Cancels enabled or disabled– int pthread_setcancelstate(
{PTHREAD_CANCEL_DISABLEPTHREAD_CANCEL_ENABLE},&oldstate)
• Asynchronous vs. deferred cancels– int pthread_setcanceltype(
{PTHREAD_CANCEL_ASYNCHRONOUS,PTHREAD_CANCEL_DEFERRED},&oldtype)
![Page 42: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/42.jpg)
CS33 Intro to Computer Systems XXXV–42 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Cancellation Points
• aio_suspend• close• creat• fcntl (when F_SETLCKW is
the command)• fsync• mq_receive• mq_send• msync• nanosleep• open• pause• pthread_cond_wait• pthread_cond_timedwait• pthread_join
• pthread_testcancel• read• sem_wait• sigwait• sigwaitinfo• sigsuspend• sigtimedwait• sleep• system• tcdrain• wait• waitpid• write
![Page 43: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/43.jpg)
CS33 Intro to Computer Systems XXXV–43 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Cleaning Up
• void pthread_cleanup_push((void)(*routine)(void *),void *arg)
• void pthread_cleanup_pop(int execute)
![Page 44: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/44.jpg)
CS33 Intro to Computer Systems XXXV–44 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Sample Code, Revisitedvoid *thread_code(void *arg) {
node_t *head = 0;
pthread_cleanup_push(cleanup, &head);
while (1) {
node_t *nodep;nodep = (node_t *)
malloc(sizeof(node_t));if (read(0, &node->value,
sizeof(node->value)) == 0) {free(nodep);
break;}
nodep->next = head;
head = nodep;}
pthread_cleanup_pop(0);return head;
}
void cleanup(void *arg) {node_t **headp = arg;
while(*headp) {node_t *nodep = head->next;
free(*headp);
*headp = nodep;}
}
![Page 45: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/45.jpg)
CS33 Intro to Computer Systems XXXV–45 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
A More Complicated Situation …
-1
6
4 9
1 5 8 11
![Page 46: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/46.jpg)
CS33 Intro to Computer Systems XXXV–46 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Start/Stop• Start/Stop interface
void wait_for_start(state_t *s){
pthread_mutex_lock(&s->mutex);while(s->state == stopped)
pthread_cond_wait(&s->queue, &s->mutex);
pthread_mutex_unlock(&s->mutex);}
void start(state_t *s) {
pthread_mutex_lock(&s->mutex);
s->state = started;pthread_cond_broadcast(&s->queue);
pthread_mutex_unlock(&s->mutex);
}
![Page 47: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/47.jpg)
CS33 Intro to Computer Systems XXXV–47 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Start/Stop• Start/Stop interface
void wait_for_start(state_t *s){
pthread_mutex_lock(&s->mutex);while(s->state == stopped)
pthread_cond_wait(&s->queue,&s->mutex);
pthread_mutex_unlock(&s->mutex);}
void start(state_t *s) {
pthread_mutex_lock(&s->mutex);s->state = started;
pthread_cond_broadcast(&s->queue);
pthread_mutex_unlock(&s->mutex);
}
Quiz 3
You’re in charge of designing POSIX threads. Should pthread_cond_waitbe a cancellation point?
a) nob) yes; cancelled
threads must acquire mutexbefore invoking cleanup handler
c) yes; but they don’t acquire mutex
![Page 48: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/48.jpg)
CS33 Intro to Computer Systems XXXV–48 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Start/Stop• Start/Stop interface
void wait_for_start(state_t *s){pthread_mutex_lock(&s->mutex);pthread_cleanup_push(
pthread_mutex_unlock, &s);
while(s->state == stopped)pthread_cond_wait(&s->queue, &s->mutex);
pthread_cleanup_pop(1);
}
void start(state_t *s) {pthread_mutex_lock(&s->mutex);
s->state = started;
pthread_cond_broadcast(&s->queue);
pthread_mutex_unlock(&s->mutex);}
![Page 49: 35Threads4 - Brown University · 2019. 11. 24. · CS33 Intro to Computer Systems XXXV–14 Copyright © 2019 Thomas W. Doeppner. All rights reserved. C Code: Add with Coarse-Grained](https://reader036.vdocument.in/reader036/viewer/2022071501/6120117b80b3606b054f6315/html5/thumbnails/49.jpg)
CS33 Intro to Computer Systems XXXV–49 Copyright © 2019 Thomas W. Doeppner. All rights reserved.
Cancellation and Conditions
pthread_mutex_lock(&m);pthread_cleanup_push(pthread_mutex_unlock, &m);while(should_wait)pthread_cond_wait(&cv, &m);
// … (code perhaps containing other cancellation points)
pthread_cleanup_pop(1);