#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());
сделать?
После вызова join()
объект потока перестаёт управлять потоком, как и при вызове detach
. get_id()
корректно возвращает пустой id - хотя это и не значит, что сам поток уничтожен окончательно, просто он не будет иметь видимых побочных эффектов.
После вызова join()
переданный функциональный объект гарантированно выполнен, т.е. в вашем случае запись в файл завершена, и можно осуществить другую запись. Неизвестно, когда и как этот функциональный объект будут удалён, но в вашем случае он содержит только ссылки и не важно, когда они будут удалены - сам объект файла управляется корневым потоком.
В более сложных ситуациях нужно учитывать, что деструктор функционального объекта может быть вызван в другом потоке (иначе невозможно было бы реализовать detach
), а значит ресурсы нужно захватывать либо по ссылке, чтобы они всегда уничтожались в корневом потоке, либо по значению - тогда не важно, в каком потоке они уничтожатся (но тут вполне можно выстрелить себе в ногу), либо черезshared_ptr
, который в данном случае схож с захватом по значению.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Хочу написать шифратор для файлов, интересуют симметричные шифрования, кроме xorЖелательно с ссылками на примеры
Помогите пожалуйста, я только начал изучать с++ и не совсем понимаю, как сделать эту задачуПонятного материала для меня я не нашел(( Прошу не бросаться...
Столкнулся с такой проблемой, мне необходимо записать абстрактный класс в unordered_map для дальнейшего использованияОднако, при попытке это сделать...
Есть два файла Не считая хэйдера arrayh , в ней только одна строчка: