Anonymous
Проблема с многопоточным/параллельным использованием ReadFile() Windows API
Сообщение
Anonymous » 31 дек 2025, 20:07
Сейчас я работаю над проектом, требующим многопоточного подхода. В настоящее время этот проект зависит от платформы, то есть Windows.
Вот как выглядит мой код чтения:
Код: Выделить всё
#pragma once
#include
#include
#include
#include
#include "Utils/error.hpp"
class mt_reader {
protected:
HANDLE _handle_disk = INVALID_HANDLE_VALUE;
uint8_t _boot_record[512] = { 0 };
std::wstring _volume_name;
public:
explicit mt_reader(std::wstring volume_name);
~mt_reader();
mt_reader(const mt_reader&) = delete;
mt_reader& operator=(const mt_reader&) = delete;
mt_reader(mt_reader&&) = delete;
mt_reader& operator=(mt_reader&&) = delete;
// mt_reader(const mt_reader& reader2);
// mt_reader& operator=(const mt_reader& e);
HANDLE handle() const { return _handle_disk; };
std::expected read(uint64_t offset, void *buf, uint32_t size);
};
#include
#include
#include
#include
#include
#include "mt_reader.hpp"
#include "Utils/error.hpp"
mt_reader::mt_reader(std::wstring volume_name) {
std::wstring valid_name = volume_name;
if (valid_name.back() == '\\') {
valid_name.pop_back();
}
_handle_disk = CreateFileW(
valid_name.c_str(),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
nullptr,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
nullptr
);
if (_handle_disk == INVALID_HANDLE_VALUE) {
auto err = win_error(GetLastError(),ERROR_LOC);
if (err.Get_First_Error_Code()!=0) {
win_error::print(err);
}
} else {
auto temp_read = read(0, _boot_record, 0x200, 'a');
if (!temp_read.has_value()) {
win_error::print(temp_read.error().add_to_error_stack("Caller: read error", ERROR_LOC));
}
}
}
mt_reader::~mt_reader() {
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79857919/issue-with-multithreaded-concurrent-use-of-readfile-windows-api[/url]
1767200847
Anonymous
Сейчас я работаю над проектом, требующим многопоточного подхода. В настоящее время этот проект зависит от платформы, то есть Windows. Вот как выглядит мой код чтения: [code]#pragma once #include #include #include #include #include "Utils/error.hpp" class mt_reader { protected: HANDLE _handle_disk = INVALID_HANDLE_VALUE; uint8_t _boot_record[512] = { 0 }; std::wstring _volume_name; public: explicit mt_reader(std::wstring volume_name); ~mt_reader(); mt_reader(const mt_reader&) = delete; mt_reader& operator=(const mt_reader&) = delete; mt_reader(mt_reader&&) = delete; mt_reader& operator=(mt_reader&&) = delete; // mt_reader(const mt_reader& reader2); // mt_reader& operator=(const mt_reader& e); HANDLE handle() const { return _handle_disk; }; std::expected read(uint64_t offset, void *buf, uint32_t size); }; #include #include #include #include #include #include "mt_reader.hpp" #include "Utils/error.hpp" mt_reader::mt_reader(std::wstring volume_name) { std::wstring valid_name = volume_name; if (valid_name.back() == '\\') { valid_name.pop_back(); } _handle_disk = CreateFileW( valid_name.c_str(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr ); if (_handle_disk == INVALID_HANDLE_VALUE) { auto err = win_error(GetLastError(),ERROR_LOC); if (err.Get_First_Error_Code()!=0) { win_error::print(err); } } else { auto temp_read = read(0, _boot_record, 0x200, 'a'); if (!temp_read.has_value()) { win_error::print(temp_read.error().add_to_error_stack("Caller: read error", ERROR_LOC)); } } } mt_reader::~mt_reader() { std::cout Подробнее здесь: [url]https://stackoverflow.com/questions/79857919/issue-with-multithreaded-concurrent-use-of-readfile-windows-api[/url]