亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: TCP多線程向同一個socket發(fā)送數(shù)據(jù),是否可能導致破壞數(shù)據(jù)的完成性? [打印本頁]

作者: morris2600    時間: 2010-01-30 21:55
標題: TCP多線程向同一個socket發(fā)送數(shù)據(jù),是否可能導致破壞數(shù)據(jù)的完成性?
如:
線程1:
  while ()
    {
      sendmsg(fd, "123456789");
         ....
     }
線程2:
   sendmsg(fd, "abcdefg")

是否可能導致接收端收到如下數(shù)據(jù)?

  "1234abcd56789efg"

最關鍵的是,如果線程1中的數(shù)據(jù)是如 |類型|長度|數(shù)據(jù).....| 這種結(jié)構(gòu), 當出現(xiàn)如上的情況時可能無法解析收到的數(shù)據(jù),此時該如何處理?

補充一點: 可能是非阻塞發(fā)送的

[ 本帖最后由 morris2600 于 2010-1-30 22:01 編輯 ]
作者: sunlan    時間: 2010-01-30 22:05
當然會亂!
作者: morris2600    時間: 2010-01-30 22:14
標題: 回復 #2 sunlan 的帖子
那這種情況下該如何解決? 謝謝!
作者: chenzhanyiczy    時間: 2010-01-31 13:48
不會,一般對文件的操作是有鎖的。這跟printf()一樣的。
作者: 思一克    時間: 2010-01-31 16:07
回復 4# chenzhanyiczy

參見:
http://www.72891.cn/thread-1651609-1-1.html
   
那個鎖不保證不亂的。
要想不亂,可以改內(nèi)核的代碼,使得能夠在send一個一定小的塊的時候是原子的,如同pipe那樣的處理。
作者: c/unix    時間: 2010-01-31 16:32
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: 思一克    時間: 2010-01-31 16:39
回復5樓:

請問版主,即使能夠保證send一個一定小的塊的時候是原子的。tcp層的分包機制會出現(xiàn)樓主說的哪 ...
c/unix 發(fā)表于 2010-01-31 16:32


你考慮的對。
即使保證了SEND對一定小塊數(shù)據(jù)的不拆分也不一定可以。我沒有詳細想。
這個操作方式本來就是扯淡的。
如同你老婆在美國,你和你兒子給她打電話。撥號接通了就是建立了一個TCP SOCKET.
你和你兒子同時說話,你老婆是可能聽亂了的。
解決方法,電話放小屋,門上鎖。你進去說一句,出來后在讓你兒子進去說。這個不亂。
作者: bluesea666    時間: 2010-01-31 18:08
你考慮的對。
即使保證了SEND對一定小塊數(shù)據(jù)的不拆分也不一定可以。我沒有詳細想。
這個操作方式本來 ...
思一克 發(fā)表于 2010-01-31 16:39



   
學習了!
作者: 思一克    時間: 2010-01-31 22:31
回復5樓:

請問版主,即使能夠保證send一個一定小的塊的時候是原子的。tcp層的分包機制會出現(xiàn)樓主說的哪 ...
c/unix 發(fā)表于 2010-01-31 16:32


我又想了,應該沒有問題的。
作者: c/unix    時間: 2010-01-31 22:43
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: 思一克    時間: 2010-02-01 16:54
感謝版主回復。
我最后也想了一下,難道我們倆指的是同一個問題?
c/unix 發(fā)表于 2010-01-31 22:43


我說的是如果修改內(nèi)核, SEND那里不分開,是有可能保持一致性的。
總之,不能這樣工作. 如果要多進程寫一個SOCKET用戶自己加鎖,
作者: chenzhanyiczy    時間: 2010-02-01 21:40
回復 5# 思一克


    你指的是tcp的緩沖區(qū)?

如果是,那確實是有問題
作者: 思一克    時間: 2010-02-02 15:59
詳細看了兩天代碼,有結(jié)論了:就是LINUX下多線程進程寫同一個TCP SOCKET不是原子的。和寫的塊大小無關。你寫10個字節(jié)也不是原子的。

我正在改動內(nèi)核的TCP發(fā)送代碼,使得能有一個選擇SOCK_OPTIONS, 設置了該選擇比如為512,就可以保證在512尺寸一下的塊對多進程/線程是原子的----和pipe的意思一樣。

我如果能做好了,會公布在這里。如果失敗了,就拉倒。
作者: beho1989    時間: 2010-02-02 18:58
不太明白!!
http://www.qiutan007.com.cn
http://www.188bet188.cn
http://www.578ba.cn




歡迎光臨 Chinaunix (http://www.72891.cn/) Powered by Discuz! X3.2