Предположим, у нас есть многопоточная программа. Мы создаем некоторые ресурсы (например, мьютексы), порождаем потоки, которые выполняют свою собственную инициализацию, ждем их завершения, а затем уничтожаем ресурсы.
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 ++ с сигналами?
Прежде всего, SIGTERM ведет себя по-разному в разных версиях библиотеки POSIX. В версии 2.6 SIGTERM принудительно завершит поток. Но с 2.4 поток будет в неопределенном состоянии.
Теперь ваш первый вопрос:
Вопрос 1: Что делать, чтобы отслеживать ресурсы? Можно ли уничтожить локальный ресурс убитого потока?
В этом случае у вас нет возможности отслеживать ресурсы, и вы больше не можете получить доступ к потоку.
Теперь ваш второй вопрос: —
Вопрос 2: Является ли поток после уничтожения все еще присоединяемым? Будет ли метод join () возвращаться немедленно? Является ли объединение () с уничтоженным потоком хорошей практикой?
Просто нет на все ваши вопросы.
Теперь ваш третий вопрос:
Вопрос 3: Поскольку уничтоженный поток мог использовать глобальный ресурс, он может остаться в недопустимом состоянии. Есть ли способ остановить все другие потоки от использования глобального ресурса, чтобы предотвратить дальнейшее повреждение?
В этом случае вы можете использовать условную переменную pthread (pthread_cond_t).
Других решений пока нет …