Код: Выделить всё
class Semaphore
{
public:
Semaphore ();
~Semaphore();
int post ();
int wait (bool blocking=true);
int getValue (int& val);
int getValue (int* val);
private:
bool is_init;
sem_t _sem_;
};Проблема вот в чём:
в деструкторе, для корректного разрушения объекта, нужно "освободить" все потоки, которые могут "висеть" заблокированными на wait'е.
Для этого я анализирую код возврата функции sem_destroy и если она возвращает код "семафор занят", то вызываю sem_post.
Потом опять sem_destroy и если ошибка, то sem_post - т.е. по идее после отработки деструктора все потоки должны разблокироваться.
Однако этого не происходит.
sem_destroy не возвращает код ошибки, хотя я уверен, что на семафоре "висит" поток.
Более того, для отладки я блокировал на семафоре поток и в деструкторе вызывал sem_post безо всяких условий - просто перед sem_destroy.
Поток не проснулся!
Если же вызывать метод post класса ДО разрушения объекта (delete mySemaphore), то поток разблокируется.
Код в контексте деструктора работает как-то особенно?