При использовании многопоточного чтения ifstream иногда не удается закрыть файлы - PullRequest
0 голосов
/ 18 апреля 2020

Различные объекты ifstream используются в разных потоках для чтения разных файлов, а затем удаляются. При удалении файла иногда возникает нарушение общего ресурса. Это нормально работает на Linux, но есть проблема с Windows.

Представление с монитором процесса показывает, что в read () есть CloseFile когда это нормально, но нет CloseFile (), когда возникает исключение.

минимальный воспроизводимый пример:

#include<thread>
#include<string>
#include<fstream>
#include<cstdlib>
#include<sstream>
#include<future>
#include<filesystem>
#include <iostream>
using namespace std;
using std::filesystem::remove;
const int tim = 1000;

string thrdid()
{
    ostringstream os;
    os << hex << this_thread::get_id();
    return os.str();
}
void read(string id)
{
    ifstream in(id);
    string dat;
    in >> dat;
}
void thrd()
{
    for (unsigned int i = 0; i < tim; ++i)
    {
        const string id = thrdid();
        system((".\\write " + id).c_str());
        read(id);
        remove(id);
    }
}
int main()
{
    thread t(thrd);
    thrd();
    t.join();
    return 0;
}

код записи

ofstream out;
int main(int argc, char* argv[])
{
    out.open(argv[1]);
    out << "Some string" << endl;
    return 0;
}
...