2013-02-19 2 views
0

В настоящее время я играю с параллельными объектами на основе Herb Sutter's presentation. В настоящее время я использую Visual Studio 2012 с ноябрьским CTP (не могу проверить содержимое ниже по-другому, Clang не нравится членам класса в decltypes, g ++ ничего не нравится в Windows).Что может означать, что идентификатор потока равен -1?

Делая это, я столкнулся с любопытной ошибкой с идентификатором потока -1. Рассмотрим следующий код:

__workerThread([=]() -> void {  
    std::cerr << std::endl; 
    while (!__done) 
    { 
     this->__innerqueue.pop()(); 
    }  
}) 

Это просто инициализация std::thread с лямбда-функции - ничего особенного, подумал я. Но без первой строки, которая вызывает вызов std :: cerr (без оптимизации), идентификатор этого потока, как представляется, равен -1 (из-за отладчика), в противном случае это похоже на то, что должно быть.

Проблема с этой нити ID возникает при выполнении

std::unique_lock<std::mutex> lock(this->__accessMutex); 

внутри message-queue, так как он выходит из строя где-то в нижних API (mutex.c).

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

Вы можете найти полный источник в Github, если хотите поиграть с ним.

+5

FYI, идентификаторы, содержащие смежные подчеркивания, зарезервированы реализацией. – Praetorian

+0

Вы пытались вызвать 'get_id()'? 'Id'' std :: thread' может даже генерироваться по запросу AFAIK. –

+0

Я не думаю, что многие люди захотят пойти в Гитуб, чтобы посмотреть на код. Можете ли вы свести к минимуму код и опубликовать его здесь? – GManNickG

ответ

3

Это похоже на проблему с инициализацией. Поток запускается до того, как будет создана полностью параллельная очередь (гонка). std::cerr, вероятно, задерживает поток достаточно долго, чтобы заставить его работать.

попытка поменять местами две строки:

std::thread __workerThread; 
mutable concurrent::queue<std::function<void()>, std::queue> __innerqueue; 

Перекачка должны создать __innerqueue до нити и он должен работать как рекламируется.

+0

Мне было интересно, если это может сработать ... и да, это так, спасибо. – DorianGrey

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