Предположим, у нас есть многопоточная программа. Мы создаем некоторые ресурсы (например, мьютексы), порождаем потоки, которые выполняют свою собственную инициализацию, ждем их завершения, а затем уничтожаем ресурсы.
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++ вообще взаимодействует с сигналами?