線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3494
推到 Plurk!
推到 Facebook!

thread 和thread間傳送資料的問題

答題得分者是:arisaka_matsuri
inanang
一般會員


發表:3
回覆:2
積分:1
註冊:2007-12-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-12-23 11:54:14 IP:61.229.xxx.xxx 訂閱
大家好
小弟有個問題 不知道是否還有別的 thread 和thread間傳送資料的問題的想法來試試看!

各個bcb程式碼的大概描述說明
main 宣告一個Form1->buffer_thread1 和Form1->buffer_thread2( 這兩個都是buffer而已! )

thread1 {
1. 用Form1->buffer 來接收 來自外部大量資料 (外部資料不斷送進來, thread1不能停!)
2. 用 setevent來告知 thread2可以開始從Form1->buffer_thread2 取資料做複雜計算
}


thread2 {
1.用WaitforSingleObejct等待 thread1通知可以從Form1->buffer_thread2 取資料
2.用memcpy 把Form1->buffer_thread1 的資料Form1->buffer_thread2 複製過來
3.做計算
}

1.那如果thread1 很快的更新寫入Form1->buffer_thread1 的資料 (外部資料不斷送進來, thread1不能停!)

情況a. 假設thread1跑很快 跑了一個cycle , 又跑第二個cycle 執行 setevent告知 thread2可以開始取資料
而這時候 thread2 搞不好 還正在努力 計算第一個cycle的資料
這樣會造成 thread2 第一個cycle的資料計算失效嗎而直接進行 第二個cycle的計算?(還是就讓它失效?)
情況b.
假設thread1跑很快 跑了一個cycle , 又跑第二個cycle 執行Form1->buffer 來接收 來自外部大量資料 而thread2 從 Form1>buffer_thread1 複製讀取資料
這樣兩個thread間同時一寫一讀buffer 可能會造成thread公共資料問題 ?
=>1.我有想過用BCB的TThread方法 Synchronize(), 但是我期待thread1 能程式碼能簡潔迅速收到大量資料所以儘可能不去考慮用它
2.或是 使用WIN API :Event , Mutex ,Critical Section以及Semaphores 的用法
不知道是否還有別的 thread 和thread間傳送資料能夠避開同時讀取thread公共資料而又能讓thread1通暢地收到大量資料
的想法 ?

2. thread 和thread間傳送資料 的問題
在 Tthread2的.h檔 宣告 如下
BUFFER 型態 *ptr2

然後 Tthread1的.h檔 宣告 如下
BUFFER型態 *ptr1
讓ptr2=ptr1 => 這樣做是讓指針指向同一個BUFFER嗎? 還是兩個BUFFER嗎
跟用memcpy 把Form1->buffer_thread1 的資料Form1->buffer_thread2 複製過來
是一樣嗎? 還是有其他 看法 請大家給我一下意見 吧
基礎觀念不清不楚的我 ╮(╯_╰)╭ 好不容易找到網路的說~~的我 (封閉的公司 居然沒網路)

------
inanang
編輯記錄
inanang 重新編輯於 2007-12-23 18:54:25, 註解 無‧
inanang 重新編輯於 2007-12-23 18:56:50, 註解 無‧
inanang 重新編輯於 2007-12-23 21:03:01, 註解 無‧
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-12-25 10:06:39 IP:61.61.xxx.xxx 訂閱
你好,

1.
[ 情況a ]
如果thread2正在處理資料,而thread1因為接收資料後執行setevent()
則thread2不會被打斷去進行次一個cycle的資料計算

當thread2處理資料完畢,回到WaitSingleObject()時
如果thread1的event仍然處於"signaled"
則thread2就會執行下一個cycle

當thread1執行週期相對的短的時候,就會發生
thread1設定event為"signaled"但是thread2正在忙碌
等到thread2會到WaitSingleObject()時,thread1已經多跑了好幾個cycle
那這中間thread1的資料就會被捨棄

[ 情況b ]
的確有可能會發生資料不同步的現象
Critical Section負擔比較小,如果要共用大量資料可以考慮

2.
ptr2=ptr1 只是讓ptr2指向ptr1的位置,也就是同一塊buffer
跟使用memcpy()的效果不同


----
以上參考看看

===================引 用 inanang 文 章===================
大家好
小弟有個問題 不知道是否還有別的 thread 和thread間傳送資料的問題的想法來試試看!

各個bcb程式碼的大概描述說明
main 宣告一個Form1->buffer_thread1 和Form1->buffer_thread2( 這兩個都是buffer而已! )

thread1 {
1. 用Form1->buffer 來接收 來自外部大量資料 (外部資料不斷送進來, thread1不能停!)
2. 用 setevent來告知 thread2可以開始從Form1->buffer_thread2 取資料做複雜計算
}


thread2 {
1.用WaitforSingleObejct等待 thread1通知可以從Form1->buffer_thread2 取資料
2.用memcpy 把Form1->buffer_thread1 的資料Form1->buffer_thread2 複製過來
3.做計算
}

1.那如果thread1 很快的更新寫入Form1->buffer_thread1 的資料 (外部資料不斷送進來, thread1不能停!)

情況a. 假設thread1跑很快 跑了一個cycle , 又跑第二個cycle 執行 setevent告知 thread2可以開始取資料
而這時候 thread2 搞不好 還正在努力 計算第一個cycle的資料
這樣會造成 thread2 第一個cycle的資料計算失效嗎而直接進行 第二個cycle的計算?(還是就讓它失效?)
情況b.
假設thread1跑很快 跑了一個cycle , 又跑第二個cycle 執行Form1->buffer 來接收 來自外部大量資料 而thread2 從 Form1>buffer_thread1 複製讀取資料
這樣兩個thread間同時一寫一讀buffer 可能會造成thread公共資料問題 ?
=>1.我有想過用BCB的TThread方法 Synchronize(), 但是我期待thread1 能程式碼能簡潔迅速收到大量資料所以儘可能不去考慮用它
2.或是 使用WIN API :Event , Mutex ,Critical Section以及Semaphores 的用法
不知道是否還有別的 thread 和thread間傳送資料能夠避開同時讀取thread公共資料而又能讓thread1通暢地收到大量資料
的想法 ?

2. thread 和thread間傳送資料 的問題
在 Tthread2的.h檔 宣告 如下
BUFFER 型態 *ptr2

然後 Tthread1的.h檔 宣告 如下
BUFFER型態 *ptr1
讓ptr2=ptr1 => 這樣做是讓指針指向同一個BUFFER嗎? 還是兩個BUFFER嗎
跟用memcpy 把Form1->buffer_thread1 的資料Form1->buffer_thread2 複製過來
是一樣嗎? 還是有其他 看法 請大家給我一下意見 吧
基礎觀念不清不楚的我 ╮(╯_╰)╭ 好不容易找到網路的說~~的我 (封閉的公司 居然沒網路)

系統時間:2024-05-08 5:07:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!