thread Что происходит при join?

188
14 февраля 2019, 21:50
#include <cstdio>
#include <iostream>
#include <fstream>
#include <thread>
using namespace std;
void fwriter(fstream &f) {
    f << " write ok"<<endl;
}
int main()
{
    fstream f;
    f.open("log.txt", fstream::in | fstream::out | fstream::app);
    thread th;
    th = thread(fwriter, ref(f));
    cout<<th.get_id()<<endl;
    th.join();
    cout<<th.get_id()<<endl;

    cout << "OK" << endl;
    getchar();
    return 0;
}

Вот такая программа есть соответственно поток после join не выполняется.

thread::id of a non-executing thread

Все ли ресурсы после этого освободил поток? Надо ещё что-то типо th.swap(thread()); сделать?

Answer 1

После вызова join() объект потока перестаёт управлять потоком, как и при вызове detach. get_id() корректно возвращает пустой id - хотя это и не значит, что сам поток уничтожен окончательно, просто он не будет иметь видимых побочных эффектов.

После вызова join() переданный функциональный объект гарантированно выполнен, т.е. в вашем случае запись в файл завершена, и можно осуществить другую запись. Неизвестно, когда и как этот функциональный объект будут удалён, но в вашем случае он содержит только ссылки и не важно, когда они будут удалены - сам объект файла управляется корневым потоком.

В более сложных ситуациях нужно учитывать, что деструктор функционального объекта может быть вызван в другом потоке (иначе невозможно было бы реализовать detach), а значит ресурсы нужно захватывать либо по ссылке, чтобы они всегда уничтожались в корневом потоке, либо по значению - тогда не важно, в каком потоке они уничтожатся (но тут вполне можно выстрелить себе в ногу), либо черезshared_ptr, который в данном случае схож с захватом по значению.

READ ALSO
C++, симметричное шифрование [закрыт]

C++, симметричное шифрование [закрыт]

Хочу написать шифратор для файлов, интересуют симметричные шифрования, кроме xorЖелательно с ссылками на примеры

198
Создание очереди в с++

Создание очереди в с++

Помогите пожалуйста, я только начал изучать с++ и не совсем понимаю, как сделать эту задачуПонятного материала для меня я не нашел(( Прошу не бросаться...

175
Segmentation fault при добавлении объекта в unordered_map

Segmentation fault при добавлении объекта в unordered_map

Столкнулся с такой проблемой, мне необходимо записать абстрактный класс в unordered_map для дальнейшего использованияОднако, при попытке это сделать...

174
как передать двумерный массив из array.cpp

как передать двумерный массив из array.cpp

Есть два файла Не считая хэйдера arrayh , в ней только одна строчка:

180