c++ - 使用相同的临界区对象读写

标签 c++ file-io critical-section

我需要编写一个类来读取和写入文件。当我进行写操作时,不应进行读取,反之亦然。我可以为此使用单个关键部分对象吗?像这样:

FileWorker.h

class FileWorker
{
public:
    FileWorker();
    void WriteIntoFile(const char* fileName, const char* stringToWrite);
    void ReadFromFile(const char* fileName, char* stringToRead, int* stringLength);
    ~FileWorker();
};

FileWorker.cpp

#include <windows.h>
#include "FileWorker.h"

static CRITICAL_SECTION g_criticalSection;

FileWorker::FileWorker()
{
#ifdef WIN32APP
    InitializeCriticalSection(&g_criticalSection);
#endif
}

void FileWorker::ReadFromFile(const char *fileName, char *stringToRead, int *stringLength)
{
    EnterCriticalSection(&g_criticalSection);
    // Do Read
    LeaveCriticalSection(&g_criticalSection);
}

void FileWorker::WriteIntoFile(const char *fileName, const char *stringToWrite)
{
    EnterCriticalSection(&g_criticalSection);
    // Do Write
    LeaveCriticalSection(&g_criticalSection);
}

FileWorker::~FileWorker()
{
#ifdef WIN32APP
    DeleteCriticalSection(&g_criticalSection);
#endif
}

谢谢。

最佳答案

如果您正在谈论同一个文件的读/写,那么您需要使用相同的临界区(就像您目前所做的那样),否则一个线程可能正在读取该文件,而另一个线程正在写入它,这正是您使用关键部分要避免的。

但是,按照您的 FileWorker 类当前的编写方式,您可以读/写任意文件,但只有一个全局临界区。这在这种情况下仍然有效,但如果很少争用同一文件,它最终会增加额外的开销。这对您来说可能是一个可以接受的权衡,具体取决于您的使用模式和此代码的时间关键程度。

此外,正如 Begemoth 指出的那样,如果您创建两个具有重叠生命周期的 FileWorker,您将遇到单个全局关键部分的问题。您将需要类似于建议的内容,以确保您不会尝试初始化已经初始化的关键部分,或者删除已经被删除的关键部分。

关于c++ - 使用相同的临界区对象读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6288229/

相关文章:

c++ - 派生纯虚函数的实现

c# - Linux/C++ 程序员到 C#/Windows 程序员

c++ - 将数组相加的函数

java - 在 Java 中用于写入文件的最好/最简单的类是什么?

c++ - 如果一个线程在关键部分调用 Acquire(),如果另一个线程调用 Release(),该锁是否会被释放?

c++ - Qt中除了单选按钮之外是否有类似gui元素的开关

c++ - Windows 手机 8 : Open jpeg in C++ code

android - 如何将数据写入文件并从应用程序外部访问它(没有 SD 卡)?

c++ - 关键部分内的 InterlockedExchange(或类似的原子操作)?

c - 轮询锁是实现关键部分的正确方法吗?