在C++中,seekg()
函數用于設置文件讀取指針的位置
互斥鎖可以確保在同一時刻只有一個線程訪問文件。你可以使用C++標準庫中的std::mutex
來實現這個功能。
#include <iostream>
#include <fstream>
#include <thread>
#include <mutex>
std::mutex mtx; // 全局互斥鎖
void readFile(const std::string& filename, long long offset) {
std::lock_guard<std::mutex> lock(mtx); // 自動加鎖
std::ifstream file(filename, std::ios::binary);
if (!file) {
std::cerr << "Error opening file: " << filename << std::endl;
return;
}
file.seekg(offset, std::ios::beg); // 設置文件指針位置
// ... 在這里進行文件讀取操作 ...
}
int main() {
std::thread t1(readFile, "file1.txt", 0);
std::thread t2(readFile, "file1.txt", 1024);
t1.join();
t2.join();
return 0;
}
原子操作是一種不可中斷的操作,可以確保在同一時刻只有一個線程訪問共享資源。C++11標準庫提供了std::atomic
模板類來實現原子操作。
#include <iostream>
#include <fstream>
#include <thread>
#include <atomic>
std::atomic<long long> filePointer(0); // 全局原子文件指針
void readFile(const std::string& filename) {
long long offset = filePointer.fetch_add(1024, std::memory_order_relaxed); // 原子增加文件指針位置
std::ifstream file(filename, std::ios::binary);
if (!file) {
std::cerr << "Error opening file: " << filename << std::endl;
return;
}
file.seekg(offset, std::ios::beg); // 設置文件指針位置
// ... 在這里進行文件讀取操作 ...
}
int main() {
std::thread t1(readFile, "file1.txt");
std::thread t2(readFile, "file1.txt");
t1.join();
t2.join();
return 0;
}
請注意,這兩種方法都有一定的局限性。互斥鎖可能會導致性能下降,因為線程需要等待鎖釋放。原子操作雖然性能較好,但在某些情況下可能不夠靈活。你可以根據具體需求選擇合適的方法。