tthread
提供了幾種同步的方法:
tthread = class
protected
procedure synchronize(method: tthreadmethod); overload; //
在繼承中呼叫同步
public
class procedure synchronize(athread: tthread; amethod: tthreadmethod); overload;
class procedure staticsynchronize(athread: tthread; amethod: tthreadmethod);
end;
onterminate
事件是執行緒安全的。
當tserversocket
的servertype
設定為stthreadblocking
方式時,要注意
onaccept:
執行緒安全
ongetthread:
執行緒安全
onthreadstart :
執行緒不安全
onthreadend :
執行緒不安全
onclientconnect:
執行緒不安全(好象沒被呼叫)
onclientdisconnect:
執行緒不安全
onclientread:
執行緒安全
onclientwrite:
執行緒安全
onclienterror:
執行緒不安全
procedure tserverclientthread.execute;
begin
fserversocket.threadstart(self);
try
try
while true do
begin
if startconnect then clientexecute;
if endconnect then break;
end;
except
handleexception;
keepincache := false;
end;
finally
fserversocket.threadend(self);
end;
end;
procedure tserverclientthread.clientexecute;
var
fdset: tfdset;
timeval: ttimeval;
begin
while not terminated and clientsocket.connected do
begin
fd_zero(fdset);
fd_set(clientsocket.sockethandle, fdset);
timeval.tv_sec := 0;
timeval.tv_usec := 500;
if (select(0, @fdset, nil, nil, @timeval) > 0) and not terminated then
if clientsocket.receivebuf(fdset, -1) = 0 then break
else synchronize(doread);
if (select(0, nil, @fdset, nil, @timeval) > 0) and not terminated then
synchronize(dowrite);
end;
end;
執行緒安全問題
執行緒安全問題導致的原因 當多條語句在操作同一個執行緒共享資料時,一個執行緒對多條語句只執行了一部分,還沒有徹底執行完畢,此時另一個執行緒參與進來執行,導致共享資料的錯誤。執行緒安全解決辦法 對多條操作共享的語句,每次只能讓一個執行緒執行完成。在執行的過程中,其他執行緒不可以參與執行。解決方案 同步...
執行緒安全問題
是指 在多個執行緒進行的情況下對全域性變數或靜態變數進行寫的操作的時候出現的資料上的問題,就是執行緒安全的問題,在讀的時候不會出現執行緒的問題 即 public void run catch interruptedexception e synchronized this 即 package com...
執行緒安全問題
由於cpu輪流切換執行緒導致某執行緒沒來的及執行完,執行緒的共享變數便直接被其他執行緒所修改。package 執行緒安全問題 public class mainclass2 class ticket extends threadcatch interruptedexception e system....
執行緒安全問題
執行緒安全問題 執行緒安全 單執行緒程式不會產生安全問題,多執行緒程式執行時,訪問各自的資源時 也不會產生執行緒安全問題。執行緒不安全 多執行緒程式執行時,訪問公共的資源。這時會產生執行緒安全問題。例如 一電影院裡面有100百張電影票,單執行緒程式相當於一個賣票視窗,現在有多個視窗賣票,一起賣這10...
執行緒安全問題
首先我們有兩個執行緒,在做i 的時候,看似是一條語句,實際上是三個步驟在執行。假設最開始 i 的值是1,理論估計在經過兩個執行緒之後,i 的值應該為3。但是實際上結果是2,那麼具體的流程是怎樣的呢 第一個執行緒在拿到1之後把它加了,但是並沒有立刻把它寫進去,導致第二個執行緒在拿的時候,由於第一個執行...