fastdfs的api是多线程和多进程安全吗?
目前使用c的api,在处理用户并发访问时,想跟作者确认一下api是否多线程和多进程安全,多谢!
g_tracker_servers是个全局变量,客户端和Storage都用到,客户端应该非线程安全吧?像函数:
tracker_get_connection
tracker_get_connection_ex
所有访问g_tracker_servers的地方都应该加锁。
[ 本帖最后由 happy_fastdfs 于 2009-10-10 16:05 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
![扫码二维码加入Web技术交流群](/public/img/jiaqun_03.jpg)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
可以做到多线程安全。
加锁是一种做法,但不建议这么用,因为会导致堵塞和等待,效率很差。
建议每个线程使用自己的tracker server,不要使用全局的。
比如:
TrackerServerInfo tracker_server;
if (tracker_get_connection_ex(&tracker_server) != 0)
{
//连接tracker server失败!
}
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在运行时没发现线程安全问题。
我的理解对不?
的确存储LZ所说的问题,V1.22版中已经修复此问题。
LZ对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守护进程的计数器也不是线程安全的,采用了类似的做法解决了多线程访问导致读取的计数器越界的问题。
用个局部变量 int server_index;避免了加锁,你的技巧也令人佩服啊!
再用个参数pTrackerServer memcpy出来,而不是直接使用pTrackerGroup内的指针,避免了不安全的隐患,学习了!
发现这个问题,归功于同事chenwq看api后的质疑,因为他是多线程环境使用api。
我今天对比测试一下,如还有问题或还有其他地方线程安全问题,今天再回复这个贴。
从svn取代码测试OK,非常感谢,期待新版本的正式发布。
实在佩服happyfish的编程水平和有耐心地回答用户提出的问题。这两天才刚开始看fastdfs,要好好地学习一下。![](https://www.wenjiangs.com/wp-content/uploads/chinaunix/202206/icon_lol.gif)
需要向happy_fastdfs 学习
期待fastdfs逐渐完善和强大起来,成为一款高质量的应用系统。很感谢作者和发现问题的各位。