multithreading - 了解 TriticalSection 和同步

标签 multithreading delphi c++builder critical-section synchronize

我想在此确认我是否正确理解了 TCriticalSectionSynchronize 的操作方式。

据我所知,Synchronize 使用 SendMessage (更新:或者至少在旧的 VCL 版本中使用它,如下面的几条评论中提到的),当前暂停执行线程(以及任何其他线程)与 PostMessage 不同,后者不会执行所需的函数(来自主线程)。在某种程度上,SendMessage 在执行时“停止”多线程。

但我不确定 TCriticalSection。假设我创建了这样的东西:

// Global variables somewhere in my code any thread can access
boost::scoped_ptr<TCriticalSection> ProtectMyVarAndCallFnction(new TCriticalSection);
int MyVariable1;
void CallMyFunctionThatAlsoModifiesMoreStuff() { /* do even more here */ };


// Thread code within one of the threads
try {
    ProtectMyVarAndCallFnction->Acquire();
    MyVariable1++;
    CallMyFunctionThatAlsoModifiesMoreStuff();
    }
__finally {
    ProtectMyVarAndCallFnction->Release();
    }

现在,我的问题是 - 关键部分如何“知道”我在这种情况下保护 MyVariable1 以及被调用函数可能修改的内容?

如果我理解正确 - 它没有 - 并且我有责任在任何线程中正确调用 Acquire() 想要更改 MyVariable1 或调用此函数(或执行两者中的任何一个) )。换句话说,我将 TCriticalSection 视为用户定义的 block ,它定义了我逻辑上分配给它的任何内容。它可以是一组变量或任何特定函数,只要我在可能写入此 block 或使用此函数的所有线程中调用 Acquire() 即可。例如,“DiskOp”可能是我在磁盘上写入的 TCriticalSection 的名称,“Internet”可能是调用从 Internet 检索某些数据的函数的 TCriticalSection 的名称。我理解正确吗?

此外,在这种情况下,TCriticalSection 是否始终需要是全局变量?

最佳答案

SendMessage suspends currently executing thread (as well as any other thread).

不,这是不正确的。 SendMessage 不会暂停任何操作。 SendMessage 只是同步传送消息。在消息传递之前该函数不会返回。即目标窗口的窗口过程已经执行完毕。并且因为窗口过程总是在拥有窗口的线程上调用,这意味着调用线程可能需要被阻塞以等待,直到窗口拥有线程准备好执行窗口过程。它绝对不会挂起进程中的所有线程。

How does the critical section know that I am protecting MyVariable1?

事实并非如此。您完全有责任确保需要保护的 MyVariable1 的所有使用都受到保护。临界区是互斥锁的一种形式。互斥体确保只有一个执行线程可以在任何时刻保持互斥体。

As I call Acquire() within all of the threads that might write to this block or use this function.

这也不是真的。 “在所有线程内”是一种错误的想法。您需要考虑“使用该变量的代码的所有部分”。

Does a critical section therefore always need to be a global kind of variable?

不,关键部分可以是全局变量。但不一定如此。

关于multithreading - 了解 TriticalSection 和同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13684159/

相关文章:

delphi - 4000 万次页面错误。如何解决这个问题?

delphi - 使用 Delphi 或 FFMpeg 从图像序列创建电影

c++ - 如何在 C++Builder 中运行两个窗体

c++ - 从 ini 文件中读取十六进制字符

Python 静态线程变量

c++ - 未初始化的互斥锁超出范围——清理?

delphi - 三重等式表达式求值

delphi - 如何生成不同频率的连续音调?

java - java线程环境下的解耦

java - 为什么将 volatile 与同步块(synchronized block)一起使用?