关于多线程编程中同步和互斥的几个问题,请高手指点!

ManOfBCB 2007-04-08 10:45:35
1、Synchronize函数是否是只针对vcl控件的?
2、TCriticalSection声请的变量是否应该为全局变量?这样可以在各个类中调用同
一个TCriticalSection才能实现对数据的保护?
3、从主线程中传入子线程中的变量,参数和类在子线程中该怎样保护呢?
4、读写文件是否也需要用TCriticalSection进行保护?
5、在子线程中申请的vcl控件是否也需要用Synchronize来进行同步?

谢谢!
...全文
351 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ManOfBCB 2007-04-13
  • 打赏
  • 举报
回复
谢谢!
ManOfBCB 2007-04-12
  • 打赏
  • 举报
回复
up
僵哥 2007-04-12
  • 打赏
  • 举报
回复
>>1、Synchronize函数是否是只针对vcl控件的?
-------------
Synchronize是用来使得子线程的某个调用与主线程同步,用以防止主结程对相关的非线程安全调用不产生冲突。

>>2、TCriticalSection声请的变量是否应该为全局变量?这样可以在各个类中调用同
一个TCriticalSection才能实现对数据的保护?
----------------
其实没这说法,只要TCriticalSection的作用范围大于或者等同于被保护数据,以达到保护目的即可,否则就算声明为全局变量也起不了多少作用,当然需要注意初始化

>>3、从主线程中传入子线程中的变量,参数和类在子线程中该怎样保护呢?
--------------------------
通常这个保持应该建议在主线程之上,而不是子线程,意思也就是如果不会产生两个线程同时对这些数据进行操作的话,就无须保护,反之,则应该在相关的数据当中设置保护机制,从而达到保护目的,而不能只是为保护而保护,为保护而刻意增加代码,这是一个结构设计问题。

>>4、读写文件是否也需要用TCriticalSection进行保护?
-------------------------
所谓是否需要保护,是建议在是否有安全问题存在可能性之上,或者说安全隐患存在的概率是不是很高,只要在你的设计当中有一处可能影响安全,就视之为不安全,进而需要保护,而使用TCriticalSection只是其中的一种保护方式

>>5、在子线程中申请的vcl控件是否也需要用Synchronize来进行同步?
-------------------------
这种做法通常不赞成,因为VCL本身是一个整合体系,当你对新建立的VCL实例,加入一个有效的主线程的VCL作为parent或者Owner的时候,VCL这个整合体系就会有相应的互操作,从而可能引发的不仅仅只是线程冲突所带来的问题。如果必须要这样子做的话,一是为该线程建立消息循环,二是在创建该控件时传入的Owner为NULL,并且不设置Parent(当然无法显示出来),否则建议在主线程当中创建,即包括创建过程也要使用Synchronize来调用。
ManOfBCB 2007-04-12
  • 打赏
  • 举报
回复
我的线程运行一会儿之后就一直在Execute()这个函数里执行,界面无法操作,连线程里的定式器都无法运行!这是这么回事呢?大家有没有遇到过呢?希望大家能指点一下!

void __fastcall TNetSvr::Execute()
{
while ( !Terminated )
{
Sleep(1);
SendData();
//Application->ProcessMessages();
}
}

wanglovec 2007-04-10
  • 打赏
  • 举报
回复
不能在子线程里申请vcl控件?
>>我的意思是, 他说的子线程申请,可能就是 在线程的构照函数里new ,这样是没有问题,但是由于子线程的构着函数是由建立TThread对象的原线程执行的,所以 释放也应该是由建立TThread对象的原线程释放.

所以说如果不注意可能出问题.
「已注销」 2007-04-09
  • 打赏
  • 举报
回复
不能在子线程里申请vcl控件?
huzhangyou 2007-04-09
  • 打赏
  • 举报
回复
5、在子线程中申请的vcl控件是否也需要用Synchronize来进行同步?
>>没试过,应该是.
其实并不是子线程申请,而是应该是 主线程申请
否则出问题.

这个不对
我得理解不对
呵呵
wanglovec 2007-04-09
  • 打赏
  • 举报
回复
2、TCriticalSection声请的变量是否应该为全局变量?这样可以在各个类中调用同
一个TCriticalSection才能实现对数据的保护?
>>TCriticalSection声请的变量应该为全局变量,如果需要保护的数据在N个线程中使用 那么该调用同一个TCriticalSection

3、从主线程中传入子线程中的变量,参数和类在子线程中该怎样保护呢?
如果需要,使用TCriticalSection就可以

4、读写文件是否也需要用TCriticalSection进行保护?
>>如果只有一个线程对该文件进行读写 则不需要,否则需要

5、在子线程中申请的vcl控件是否也需要用Synchronize来进行同步?
>>没试过,应该是.
其实并不是子线程申请,而是应该是 主线程申请
否则出问题.
huzhangyou 2007-04-08
  • 打赏
  • 举报
回复
Graphics objects are thread-safe. You do not need to use the main VCL or CLX thread to access TFont, TPen, TBrush, TBitmap, TMetafile (VCL only), TDrawing (CLX only), or TIcon. Canvas objects can be used outside the Synchronize method by locking them.

While list objects are not thread-safe, you can use a thread-safe version, TThreadList, instead of TList.

上面说了一些线程安全的类
huzhangyou 2007-04-08
  • 打赏
  • 举报
回复
呵呵 Critical sections must be global in scope so that they are available to all threads. In every thread,
这是逆的第一个问题的精确解释
huzhangyou 2007-04-08
  • 打赏
  • 举报
回复
信仰(250731818) 12:42:10
all objects access their properties and execute their methods within this single thread, you need not worry about your objects interfering with each other.
信仰(250731818) 12:42:21
这是Synchronize的说明
信仰(250731818) 12:42:46
Because Synchronize uses the message loop, it does not work in console applications. You must use other mechanisms, such as critical sections, to protect access to VCL or CLX objects in console applications.
信仰(250731818) 12:42:59
逆看这个
告诉我们Synchronize不是万能的
信仰(250731818) 12:43:11
有时候使用critical section完全可以替代
信仰(250731818) 12:43:28
Synchronize 使用的是消息循环
huzhangyou 2007-04-08
  • 打赏
  • 举报
回复
信仰(250731818) (2007-04-08 12:24:57)
的五个问题
我发现使用Synchronize的时候偶尔会造成死掉
所以对于不同步操作的VCL 可以不实用Synchronize
信仰(250731818) (2007-04-08 12:24:21)
第四个问题 是的
只要涉及到同步操作的 都需要保护
信仰(250731818) (2007-04-08 12:24:06)
第一个问题
是的
第二个问题
我一般是这么使用
第三个问题
使用TCriticalSection就可以

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧