临界区是否会阻止由另一个线程对临界区内修改的变量的读取访问?

问题描述

如果我在一个线程中修改临界区中的变量,临界区是否会在临界区代码执行时阻止另一个线程读取该变量?我已经搜索了 StackOverflow 的帖子,但我没有看到直接讨论这个。

上下文:我目前正在通过只允许一个线程写入变量(在本例中为指针)来处理线程之间对共享变量的写入同步。例如,如果只有线程#1 被授权写入,当线程#2 想要修改变量时,我发送消息给线程#1 修改变量,线程#1 响应线程#2 的请求修改变量.这可以很好地序列化对变量的写访问。

但实际上,线程 #2 经常通过该指针读取数据。我担心如果线程 #1 恰好在我尝试从另一个线程读取数据的确切时间修改该指针,我会损坏。

我最初的想法是将我修改该变量的部分包装在关键部分中,但所有关于关键部分的文档和帖子都指出它会阻止访问执行代码的那部分修改一个变量,但我找不到任何关于它是否阻止访问在临界区中被修改变量的讨论。

作为人为的示例代码片段:

///////////////
// Thread #1
///////////////

class CNode
{
  public:
    CNode(){m_Status = 0;}
    unsigned int GetStatus(){return m_Status;}
    void SetStatus(int status){m_Status = status;m_Status++;m_Status++}
  protected: 
    m_Status;
};

CNode* pNode = new CNode;
CRITICAL_SECTION CriticalSection;

void mainThreadFunction1()
{
    unsigned int i = 0;
    while(1)
    {
       ModifyNodeStatus(i);
       i+=2;
    }
}

void ModifyNodeStatus(unsigned int status)
{
   EnterCriticalSection(&CriticalSection);
   pNode->SetStatus(status);
   LeaveCriticalSection(&CriticalSection);
} 


///////////////
// Thread #2
///////////////////

void mainThreadFunction2()
{
    unsigned int thread1Status = 0;
    while (1)
       thread1Status = pNode->GetStatus();
}

临界区是否在执行时阻止了从线程 #2 对变量的读取访问?在这个例子中,如果它阻止读取访问,我希望只返回偶数(调用 ModifyNodeStatus() 之前或之后的值),但如果没有,我可能偶尔会得到一个奇数。>

如果临界区没有阻止读取访问,那么有人可以推荐一种在写入时这样做的替代方法吗?

感谢您的考虑。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)