Няма описание
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main-signal-cv.c 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #include <stdio.h>
  2. #include "mythreads.h"
  3. //
  4. // simple synchronizer: allows one thread to wait for another
  5. // structure "synchronizer_t" has all the needed data
  6. // methods are:
  7. // init (called by one thread)
  8. // wait (to wait for a thread)
  9. // done (to indicate thread is done)
  10. //
  11. typedef struct __synchronizer_t {
  12. pthread_mutex_t lock;
  13. pthread_cond_t cond;
  14. int done;
  15. } synchronizer_t;
  16. synchronizer_t s;
  17. void signal_init(synchronizer_t *s) {
  18. Pthread_mutex_init(&s->lock, NULL);
  19. Pthread_cond_init(&s->cond, NULL);
  20. s->done = 0;
  21. }
  22. void signal_done(synchronizer_t *s) {
  23. Pthread_mutex_lock(&s->lock);
  24. s->done = 1;
  25. Pthread_cond_signal(&s->cond);
  26. Pthread_mutex_unlock(&s->lock);
  27. }
  28. void signal_wait(synchronizer_t *s) {
  29. Pthread_mutex_lock(&s->lock);
  30. while (s->done == 0)
  31. Pthread_cond_wait(&s->cond, &s->lock);
  32. Pthread_mutex_unlock(&s->lock);
  33. }
  34. void* worker(void* arg) {
  35. printf("this should print first\n");
  36. signal_done(&s);
  37. return NULL;
  38. }
  39. int main(int argc, char *argv[]) {
  40. pthread_t p;
  41. signal_init(&s);
  42. Pthread_create(&p, NULL, worker, NULL);
  43. signal_wait(&s);
  44. printf("this should print last\n");
  45. return 0;
  46. }