Предполагается, что pthread_cond_wait () блокирует мьютекс при возврате, и это могло произойти, но окончательная разблокировка не прошла, так как мы принудительно отменили поток. В целях безопасности я обычно стараюсь вообще не использовать pthread_cancel (), поскольку некоторые платформы даже не поддерживают это. Вы можете использовать изменчивый bool или атомарный и проверить, должна ли нить быть закрыта. Таким образом, мьютексы также будут обрабатываться чисто.

я проблема с pthreads, где я думаю, что захожу в тупик. Я создал очередь блокировки, которая, как мне показалось, работала, но после некоторого тестирования я обнаружил, что если я пытаюсь отменить несколько потоков, которые блокируют блокирующую очередь, я, похоже, захожу в тупик.

Очередь блокировки очень проста и выглядит так:

template <class T> class Blocking_Queue
{
public:
    Blocking_Queue()
    {
        pthread_mutex_init(&_lock, NULL);
        pthread_cond_init(&_cond, NULL);
    }

    ~Blocking_Queue()
    {
        pthread_mutex_destroy(&_lock);
        pthread_cond_destroy(&_cond);
    }

    void put(T t)
    {
        pthread_mutex_lock(&_lock);
        _queue.push(t);
        pthread_cond_signal(&_cond);
        pthread_mutex_unlock(&_lock);
    }

     T pull()
     {
        pthread_mutex_lock(&_lock);
        while(_queue.empty())
        {
            pthread_cond_wait(&_cond, &_lock);
        }

        T t = _queue.front();
        _queue.pop();

        pthread_mutex_unlock(&_lock);

        return t;
     }

priavte:
    std::queue<T> _queue;
    pthread_cond_t _cond;
    pthread_mutex_t _lock;
}

Для тестирования я создал 4 потока, которые тянут эту очередь блокировки. Я добавил несколько операторов печати в очередь блокировки, и каждый поток получает метод pthread_cond_wait (). Однако, когда я пытаюсь вызвать pthread_cancel () и pthread_join () в каждом потоке, программа просто зависает.

Я также проверил это только с одной нитью, и она отлично работает.

Согласно документации, pthread_cond_wait () является точкой отмены, поэтому вызов метода cancel для этих потоков должен привести к остановке их выполнения (и это работает только с 1 потоком). Однако pthread_mutex_lock не является точкой отмены. Может ли что-то происходить по аналогии с вызовом pthread_cancel (), отмененный поток извлекает мьютекс перед завершением и не разблокирует его, а затем, когда следующий поток отменяется, он не может получить мьютекс и взаимоблокировки? Или есть что-то еще, что я делаю не так.

Любой совет был бы прекрасен. Спасибо :)

Ответы на вопрос(3)

Ваш ответ на вопрос