亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区
Chinaunix
標(biāo)題:
fastdfs的api是多線程和多進(jìn)程安全嗎?
[打印本頁]
作者:
happy_fastdfs
時間:
2009-10-10 14:03
標(biāo)題:
fastdfs的api是多線程和多進(jìn)程安全嗎?
目前使用c的api,在處理用戶并發(fā)訪問時,想跟作者確認(rèn)一下api是否多線程和多進(jìn)程安全,多謝!
g_tracker_servers是個全局變量,客戶端和Storage都用到,客戶端應(yīng)該非線程安全吧?像函數(shù):
tracker_get_connection
tracker_get_connection_ex
所有訪問g_tracker_servers的地方都應(yīng)該加鎖。
[
本帖最后由 happy_fastdfs 于 2009-10-10 16:05 編輯
]
作者:
happy_fish100
時間:
2009-10-10 16:47
標(biāo)題:
回復(fù) #1 happy_fastdfs 的帖子
可以做到多線程安全。
加鎖是一種做法,但不建議這么用,因為會導(dǎo)致堵塞和等待,效率很差。
建議每個線程使用自己的tracker server,不要使用全局的。
比如:
TrackerServerInfo tracker_server;
if (tracker_get_connection_ex(&tracker_server) != 0)
{
//連接tracker server失敗!
}
作者:
happy_fastdfs
時間:
2009-10-12 09:59
標(biāo)題:
這個函數(shù)也不是線程安全的
tracker_get_connection_ex函數(shù)
pCurrentServer = g_tracker_servers + g_tracker_server_index;//線程A 根據(jù)g_tracker_server_index memcpy出最后這個tracker結(jié)構(gòu)體時,線程B剛好將g_tracker_server_index++到越界位置,memcpy時會越界訪問。
memcpy(pTrackerServer, pCurrentServer, sizeof(TrackerServerInfo));
pTrackerServer->sock = -1;
if (tracker_connect_server(pTrackerServer) == 0)
{
g_tracker_server_index++;//線程B剛好將g_tracker_server_index++到越界位置
if (g_tracker_server_index >= g_tracker_server_count)
{
g_tracker_server_index = 0;
}
return 0;
}
所以后面版本看看能不能實現(xiàn)幾個不使用全局變量g_tracker_servers和 g_tracker_server_index的tracker連接管理函數(shù)?梢园雅渲梦募械膖racker列表讀到全局變量中,因為運(yùn)行時只讀,然后每個線程get connection時從全局配置中讀出各個tracker的ip和port,構(gòu)建線程自己的tracker_servers。
搜索代碼看到應(yīng)該是Storage也用到全局變量g_tracker_servers,幸好Storage需要重啟才會改變g_tracker_server_count,看來server在運(yùn)行時沒發(fā)現(xiàn)線程安全問題。
我的理解對不?
作者:
happy_fish100
時間:
2009-10-12 21:25
標(biāo)題:
回復(fù) #3 happy_fastdfs 的帖子
的確存儲LZ所說的問題,V1.22版中已經(jīng)修復(fù)此問題。
LZ對FastDFS研究得比較深入啊,再次贊一個!
作者:
happy_fish100
時間:
2009-10-12 21:36
標(biāo)題:
回復(fù) #3 happy_fastdfs 的帖子
修正后的代碼片段如下:
int server_index;
server_index = pTrackerGroup->server_index;
if (server_index >= pTrackerGroup->server_count)
{
server_index = 0;
}
pCurrentServer = pTrackerGroup->servers + server_index;
以前tracker server守護(hù)進(jìn)程的計數(shù)器也不是線程安全的,采用了類似的做法解決了多線程訪問導(dǎo)致讀取的計數(shù)器越界的問題。
作者:
happy_fastdfs
時間:
2009-10-13 09:14
用個局部變量 int server_index;避免了加鎖,你的技巧也令人佩服!
再用個參數(shù)pTrackerServer memcpy出來,而不是直接使用pTrackerGroup內(nèi)的指針,避免了不安全的隱患,學(xué)習(xí)了!
發(fā)現(xiàn)這個問題,歸功于同事chenwq看api后的質(zhì)疑,因為他是多線程環(huán)境使用api。
我今天對比測試一下,如還有問題或還有其他地方線程安全問題,今天再回復(fù)這個貼。
作者:
happy_fastdfs
時間:
2009-10-13 15:13
從svn取代碼測試OK,非常感謝,期待新版本的正式發(fā)布。
作者:
jackywdx
時間:
2009-10-16 17:51
實在佩服happyfish的編程水平和有耐心地回答用戶提出的問題。這兩天才剛開始看fastdfs,要好好地學(xué)習(xí)一下。
需要向happy_fastdfs 學(xué)習(xí)
作者:
sopato
時間:
2009-10-29 17:39
期待fastdfs逐漸完善和強(qiáng)大起來,成為一款高質(zhì)量的應(yīng)用系統(tǒng)。很感謝作者和發(fā)現(xiàn)問題的各位。
歡迎光臨 Chinaunix (http://www.72891.cn/)
Powered by Discuz! X3.2