C ++ - вектор thread_local вызывает сбой при объединении () - PullRequest
0 голосов
/ 24 апреля 2018

РЕДАКТИРОВАТЬ: в исходном вопросе thread_array был объявлен как vector<thread> thread_array(4); вместо vector<thread> thread_array;, что вызвало ошибку - это было отредактировано сейчас, но проблема сохраняется.

Исходя из этого вопроса: Программа на C ++ иногда падает, когда join () - нить потоков

Мне удалось сузить ее до этой очень простой программы, которую, надеюсь, вы сможете легко скомпилировать и запустить:

#include <thread>
#include <vector>
using namespace std;

thread_local vector<int> v;

void foo(int n) 
{  
    for(int i=0 ; i<n ; i++)
        v.push_back(i);
}

int main() 
{
    vector<thread> thread_array;
    for(int i=0 ; i<4 ; i++)
        thread_array.push_back(thread(foo,100));
    for(int i=0 ; i<4 ; i++)
        thread_array.at(i).join();
    return 0;
}

Почему происходит сбой этой программы после достижения второго цикла for (присоединяющегося)?Это ошибка MinGW?Насколько я знаю, я не должен делать ничего лишнего с вектором thread_local.Я могу опубликовать подробности, если это необходимо.

1 Ответ

0 голосов
/ 24 апреля 2018

thread_array на самом деле содержит 8 объектов.4 значения по умолчанию std::thread, добавленные vector<thread> thread_array(4); и 4 you push_back после.Во втором цикле вы пытаетесь join создать созданные по умолчанию те, которые не объединяются.

Чтобы решить эту проблему, просто не добавляйте 4 созданные по умолчанию потоки вместо использования push_back:

int main() 
{
    vector<thread> thread_array; // <-- remove (4) from here
    for(int i=0 ; i<4 ; i++)
        thread_array.push_back(thread(foo,100));
    for(int i=0 ; i<4 ; i++)
        thread_array.at(i).join();
    return 0;
}

В качестве альтернативы вы можете назначить 4 построенных по умолчанию:

int main()
{
    vector<thread> thread_array(4);
    for (auto & worker : thread_array)
        worker = thread(foo, 100);
    for (auto & worker : thread_array)
        worker.join();
    return 0;
}
...