Что делать с std :: thread после его уничтожения?

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

void run(void)
{
some_resource global_resource;
global_resource.create();

vector<thread> my_threads;
my_threads.reserve(thread_count);

for(int i = 0; i < thread_count; i++)
my_threads.push_back(
thread([&global_resource](int i)
{
another_resource local_resource;
local_resource.create();

// SIGTERM can happen here:
work_with_resources(global_resource, local_resource, i);

local_resource.destroy();
},
i)
);

for(int i = 0; i < thread_count; i++)
my_threads[i].join();

global_resource.destroy();
}

Теперь предположим, что один из потоков, к сожалению, получил SIGTERM во время work_with_resources (). Это означает, что локальный ресурс потока никогда не будет уничтожен.

Вопрос 1: Что делать, чтобы отслеживать ресурсы? Можно ли уничтожить локальный ресурс убитого потока?

Вопрос 2: Является ли поток после уничтожения все еще присоединяемым? Будет ли метод join () возвращаться немедленно? Является ли объединение () с уничтоженным потоком хорошей практикой?

Вопрос 3: Поскольку уничтоженный поток мог использовать глобальный ресурс, он может остаться в недопустимом состоянии. Есть ли способ остановить все другие потоки от использования глобального ресурса, чтобы предотвратить дальнейшее повреждение?

Взаимодействует ли библиотека потоков C ++ с сигналами?

2

Решение

Прежде всего, SIGTERM ведет себя по-разному в разных версиях библиотеки POSIX. В версии 2.6 SIGTERM принудительно завершит поток. Но с 2.4 поток будет в неопределенном состоянии.

Теперь ваш первый вопрос:

Вопрос 1: Что делать, чтобы отслеживать ресурсы? Можно ли уничтожить локальный ресурс убитого потока?

В этом случае у вас нет возможности отслеживать ресурсы, и вы больше не можете получить доступ к потоку.

Теперь ваш второй вопрос: —

Вопрос 2: Является ли поток после уничтожения все еще присоединяемым? Будет ли метод join () возвращаться немедленно? Является ли объединение () с уничтоженным потоком хорошей практикой?

Просто нет на все ваши вопросы.

Теперь ваш третий вопрос:

Вопрос 3: Поскольку уничтоженный поток мог использовать глобальный ресурс, он может остаться в недопустимом состоянии. Есть ли способ остановить все другие потоки от использования глобального ресурса, чтобы предотвратить дальнейшее повреждение?

В этом случае вы можете использовать условную переменную pthread (pthread_cond_t).

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]