我正在创建一个启动线程的服务器(监听线程)。这个线程监听连接并做它的事情。最终它可能会收到一些我希望传递给服务器创建者的数据:
我的节目 - >创建我的服务器 - >创建监听器 - >为每个客户端创建一个线程
现在的问题是:如果我赋予对象属性OnData = procedure(const Received:string);当我创建它时到服务器,然后,这个相同的过程被传递给客户端线程,所以当线程获得一些数据时,它将能够将它传递回服务器的创建者。在伪代码中:
//My program
MyServer:= TServer.Create();
MyServer.Ondata:= SomeProcedure;
//The client thread
//When data is received
if (FServer <> nil) then
if Assigned(FServer.Ondata) then
Fserver.Ondata(ReceivedString)..
这里的问题是:
1-我理解如果10个线程同时执行此过程,则该过程将在客户端线程上下文中执行,因此我的程序(该过程的实际“所有者”)有责任进行同步。是对的吗?
2-如果10个不同的线程执行该过程,我是否有10个“实例”的过程,同时它自己的数据在运行?
3-我是否也需要保护Server对象上的OnData(例如,使用关键部分),或者可以将其保留为“实际”程序?
答案 0 :(得分:3)
是。当线程运行时,它运行的所有代码都在其自己的线程上下文中执行,除非该代码已经发送到另一个线程,例如使用Synchronize方法。
几乎。您有10个TThread对象实例,每个实例都有自己的数据,同时运行。该过程的实际代码只有一个副本,但多个数据对象可以一次使用它。
任何非线程安全的代码(可能访问VCL,或者写入任何共享数据,或从其他人可能写入的共享数据中读取)都需要受到保护。