none
使用 socket, queue, thread 時發生的問題, RRS feed

  • 問題

  •  

    我有 4 個 TcpClient , 在 ReceiveCallback function 裡頭, 把收到的 data 處理過後,

    放在一個 public 的 queue 中,

    然後有另一個 thread 用 do ~ loop 去檢查 queue 的 count 若大於 0 時, dequeue 並存檔,

     

    ReceiveCallback 裡頭的 data 處理完之後, 是一個 byte array,

    我宣告了一個 structure 如下,

    Structure myStru

        myData() As Byte

        DataTime As Date

        SockIndex As Integer

    End Structure

     

    SockIndex 代表哪個 TcpClient 收到的 Data,

    myData 就放處理好的 Data,

    然後 DataTime = Now , 之後 enqueue

    所以 queue 裡的 Data 會有來源及時間,

    可是我在 dequeue 時,

    大部份的時間是順序是正常的, 也就是每次 dequeue 出來的 data, DataTime 都會大於上次 dequeue 的結果,

    但常常程式跑幾個小時之後, 發現 "同一個 SockIndex" 的 Data 順序是錯亂的,

    例如我現在 dequeue 出來 的是 10:00:05 的 Data ,

    下次 dequeue 到同一個 SockIndex 的 Data , 是 9:59:45

    時間不一定, 但理論上不應該會比前一次 dequeue 的結果還早,

     

    我的 ReceiveCallback 裡頭, 處理 Data 只有計算 Xor 的 checksum,

    幾個 array copy, 中間沒有 sleep, 就算有 sleep , 不同 SockIndex 的 Data 間如果順序不同, 那可以理解,

    但由同一個 TcpClient 引發的 ReceiveCallback , 我並沒有另外開 thread 去跑,

    都是引發後, EndReceive, 處理 Data, 取得 Now , enqeue, 然後再 BeginReceive,

     

    請問有大大知道問題出在哪裡嗎?

    2007年12月19日 上午 02:19

解答

  • HI,

     

    您的狀況是一支Server程式在處理四支TcpClient程式送進來的資料嗎? 是建立四個執行緒分別服務四個TcpClient程式嗎? 如果四支TcpClient程式送進來的資料都存放到同一個Queue, 那您的QUEUE有沒有控制同一時間不能被一個以上的Thread存取?

     

    tihs

    2007年12月20日 上午 01:31

所有回覆

  • HI,

     

    您的狀況是一支Server程式在處理四支TcpClient程式送進來的資料嗎? 是建立四個執行緒分別服務四個TcpClient程式嗎? 如果四支TcpClient程式送進來的資料都存放到同一個Queue, 那您的QUEUE有沒有控制同一時間不能被一個以上的Thread存取?

     

    tihs

    2007年12月20日 上午 01:31
  •  

    十分感謝大大的回覆,

    我的 TcpClient 是包在一個 class 裡頭,

    然後在 form 上宣告 4 個實體後, 分別讓 socket connect 上,

    然後各自交給 receiveCallback 去處理,

    在 EnQueue 的地方我並沒有做 SyncLock,

    但是, 即使是同時存取的問題, 那應該是不同 TcpClient 進來的 Data 順序不對,

    不應該是同一個 TcpClient 存的 Data 順序錯誤吧?

    2007年12月20日 上午 01:41