- 论坛徽章:
- 0
|
这个函数也不是线程安全的
tracker_get_connection_ex函数
pCurrentServer = g_tracker_servers + g_tracker_server_index;//线程A 根据g_tracker_server_index memcpy出最后这个tracker结构体时,线程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;
}
所以后面版本看看能不能实现几个不使用全局变量g_tracker_servers和 g_tracker_server_index的tracker连接管理函数。可以把配置文件中的tracker列表读到全局变量中,因为运行时只读,然后每个线程get connection时从全局配置中读出各个tracker的ip和port,构建线程自己的tracker_servers。
搜索代码看到应该是Storage也用到全局变量g_tracker_servers,幸好Storage需要重启才会改变g_tracker_server_count,看来server在运行时没发现线程安全问题。
我的理解对不? |
|