2014-10-29 1 views
0

У меня возникают проблемы с тех пор, как я внес изменения в свою программу, и это может быть связано с тем, что поток вызывает соединение. Что происходит в этой ситуации?Что произойдет, если std :: thread вызывает joinable на себе?

EDIT: Я сделал некоторую отладку, и проблема была объединена.

std::mutex threadMutex; 
std::thread tAudioProcessingThread; 

void getLock() 
{ 
    if (tAudioProcessingThread.joinable()) 
     threadMutex.lock(); 
} 

void releaseLock() 
{ 
    if (tAudioProcessingThread.joinable()) 
     threadMutex.unlock(); 
} 

getLock() Функции и releaseLock() вызываются из двух существующих потоков. У меня возникли проблемы с вызовом функций threadMutex.lock() и threadMutex.unlock() до создания потока, поэтому мне пришлось выполнять эти альтернативные функции, чтобы блокировки вызывались только тогда, когда поток существует.

+1

очень вероятно, либо неопределенный, либо тупиковый .... – Soren

+2

Мы не можем отдать ответ без тестового теста _complete_. –

+0

Чтобы правильно обрабатывать блокировки, вы должны использовать ['lock_guard'] (http://en.cppreference.com/w/cpp/thread/lock_guard) вместо того, чтобы загружать свой собственный материал там. BTW, если поток фактически не работает, почему вы беспокоитесь о блокировке/разблокировке мьютекса?!? –

ответ

1

Нить не может сам join(), но нет ничего плохого в поток вызова joinable() на себя.

Все t.joinable() это тест t.get_id() != std::thread::id{}, поэтому не имеет значения, в какую нить вы его вызываете.

0

Камерон был прав, моя ошибка была в другом месте кода, так что эти функции не нужны, и блокировка выполняется правильно.

@ πάντα ῥεῖ: У меня были блокировки функций, которые вызывались до и после создания потока, поэтому мне пришлось поместить туда замки.

PS: Не могу пока комментировать, вот почему так много правок и так далее ...

Спасибо, ребята

Смежные вопросы