gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:48:27 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com