В настоящее время я играю с параллельными объектами на основе 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, если хотите поиграть с ним.
FYI, идентификаторы, содержащие смежные подчеркивания, зарезервированы реализацией. – Praetorian
Вы пытались вызвать 'get_id()'? 'Id'' std :: thread' может даже генерироваться по запросу AFAIK. –
Я не думаю, что многие люди захотят пойти в Гитуб, чтобы посмотреть на код. Можете ли вы свести к минимуму код и опубликовать его здесь? – GManNickG