- 論壇徽章:
- 0
|
這個函數(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列表讀到全局變量中,因為運行時只讀,然后每個線程get connection時從全局配置中讀出各個tracker的ip和port,構(gòu)建線程自己的tracker_servers。
搜索代碼看到應(yīng)該是Storage也用到全局變量g_tracker_servers,幸好Storage需要重啟才會改變g_tracker_server_count,看來server在運行時沒發(fā)現(xiàn)線程安全問題。
我的理解對不? |
|