我目前正在使用一个没有线程安全规范的C库。库的源代码中有一些文件静态非const变量,所以我认为它不是线程安全的。
但是,我想同时运行它以提高吞吐量。我怎样才能做到这一点?
编辑:
1)我不想要任何使其成为串行的解决方案,因为我的goad是为了提高吞吐量
2)我想在不修改库代码的基础上限制讨论,除非它可以非常容易地完成。我可能需要使用数十个库。修改每个库根本不可行。
我想添加@ JonChesterfield对&#34的评论;并发不需要暗示线程"并且"理解api而不是代码广泛地是图书馆的重点。这里。感谢您完全理解我的需求!
答案 0 :(得分:3)
缺少修复代码,你不能。
您可以将代码作为单独的并行进程运行(假设库不共享操作系统级别对象,如硬编码文件位置),甚至可以单独使用计算机。
答案 1 :(得分:2)
但是,我想同时运行它以提高吞吐量。我怎么能这样做?
没有灵丹妙药。您不能盲目地遵循一个简单的规则并转换代码,以便它支持并发执行。
您需要从并发的角度理解代码,然后将其更改为支持并发(如果需要)。或者甚至只是按照使用库的方式遵循并发规则。
这可能意味着使用互斥锁保护共享数据访问。或者用分离的数据替换共享数据。或者可以有这些方法的组合。或许多其他可能的技术。
底线是它取决于代码,你必须深入了解它。
在对问题的编辑中,您声明您不希望任何序列化,因为您希望尽可能多的并发性,并且您不想修改库。这些期望是不现实的。通过在它上面挥动魔杖,并发性不是可以嫁接到任意代码上的东西。我知道你不想接受我的观点,但我认为最终你会意识到并发很难。
答案 2 :(得分:1)
您可以通过在所有静态变量前面编写__thread或thread_local来将其破解为多个线程。这将阻止线程相互腐蚀,但它并不漂亮。当然,您仍然需要一种安全的方式在线程之间传递数据。
最好是使用fork生成程序的N个实例,并根据需要使用(posix)消息队列或套接字在它们之间传递数据。
最安全且最简单的方法是运行N个程序副本,所有这些副本都在不同的输入文件上。
最好但最昂贵的是将代码更新为正确且优雅的线程安全 - 没有可变的全局变量,没有静态变量。
(thread__local vs __thread取决于您的编译器以及您是将C库编译为C ++还是C)