Advertisement
Guest User

Untitled

a guest
Dec 16th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.17 KB | None | 0 0
  1. #ifndef TSQUEUE_H_
  2. #define TSQUEUE_H_
  3.  
  4. #include <pthread.h>
  5. #include "queue.h"
  6.  
  7. extern "C" {
  8.  
  9. /**
  10.  * Opaque-структура, описывающая потокобезопасную очередь: внутренности нельзя
  11.  * использовать напрямую, только при помощи функцией threadsafe_queue_*().
  12.  */
  13. struct ThreadsafeQueue {
  14.     Queue q;
  15.     pthread_mutex_t mutex;
  16.     pthread_cond_t cond;
  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