Advertisement
_Bad_Liar_

Untitled

Dec 16th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.16 KB | None | 0 0
  1. #ifndef TSQUEUE_H_
  2. #define TSQUEUE_H_
  3.  
  4. #include "queue.h"
  5. #include <pthread.h>
  6.  
  7. extern "C" {
  8.  
  9. /**
  10. * Opaque-структура, описывающая потокобезопасную очередь: внутренности нельзя
  11. * использовать напрямую, только при помощи функцией threadsafe_queue_*().
  12. */
  13. struct ThreadsafeQueue {
  14. Queue q;
  15. pthread_cond_t cond;
  16. pthread_mutex_t mutex;
  17. };
  18.  
  19. /**
  20. * Инициализирует потокобезопасную очередь, лежащую по указателю `q`.
  21. * Если очередь по указателю `q` уже инициализирована, поведение не определено.
  22. * Очередь должна быть освобождена при помощи `threadsafe_queue_destroy`,
  23. * в противном случае возможны утечки ресурсов.
  24. */
  25. void threadsafe_queue_init(ThreadsafeQueue *q);
  26.  
  27. /**
  28. * Удаляет потокобезопасную очередь, лежащую по указателю `q`, и освобождает
  29. * все связанные с ней ресурсы. Если очередь непуста,
  30. * поведение неопределено, так как в ней ещё могут лежат
  31. * произвольные ресурсы, которые очередь не в состоянии освободить.
  32. *
  33. * После удаления все операции с очередью, кроме `threadsafe_queue_init`,
  34. * неопределены.
  35. */
  36. void threadsafe_queue_destroy(ThreadsafeQueue *q);
  37.  
  38. /**
  39. * Добавляет в очередь произвольный указатель `data`.
  40. * Эта операция может безопасно вызываться из нескольких потоков одновременно.
  41. */
  42. void threadsafe_queue_push(ThreadsafeQueue *q, void *data);
  43.  
  44. /**
  45. * Удаляет из очереди очередной элемент, записывает его значение в `*data`.
  46. * Возвращает `true`, если очередь была непуста, `false` иначе.
  47. * Если очередь была пуста, значение `*data` не меняется.
  48. * Если `data == nullptr` и очередь была непуста, поведение не определено.
  49. * Эта операция может безопасно вызываться из нескольких потоков одновременно.
  50. */
  51. bool threadsafe_queue_try_pop(ThreadsafeQueue *q, void **data);
  52.  
  53. /**
  54. * Удаляет из очереди очередной элемент и возвращает его значение.
  55. * Если очередь пуста, блокирует выполнение текущего потока до тех пор,
  56. * пока элемент не будет добавлен при помощи `threadsafe_queue_push()`.
  57. * Эта операция может безопасно вызываться из нескольких потоков одновременно.
  58. */
  59. void *threadsafe_queue_wait_and_pop(ThreadsafeQueue *q);
  60. }
  61.  
  62. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement