非线程安全库和线程

时间:2012-04-04 01:26:45

标签: c

将非线程安全库与线程一起使用。假设我有一个与服务器建立连接的库。它是非线程安全的。我可以在2个线程内使用启动库吗?

即:

thread_1(){
telnet_lib_t *connection1;

while(1){
do_somestuff
}

free_telnet(connection1);
}

thread_2(){
telnet_lib_t *connection2;

while(1){
     do_somestuff;
}

free_telnet(connection2);
}

这会有用吗?现在我有两个独立的库运行实例。所以他们不会互相干扰,对吗?

4 个答案:

答案 0 :(得分:1)

不,你不能这样做。如果库没有全局状态且其功能只是内部非线程安全的,那么您可以通过使用互斥锁保护整个库并且只允许一个线程一次访问它来解决问题(但这可能是禁止的,特别是如果库执行任何缓慢或阻塞任务)。但是如果库基本上具有它所使用的单一全局状态,并且无法保存/恢复/交换状态,则根本无法在多个线程中使用它(甚至在非线程程序中交替使用多个上下文) )。这些图书馆通常被认为是垃圾,应予以更换。

答案 1 :(得分:0)

这取决于它为什么不是线程安全的。

例如,如果库使用了一些静态变量,那么它仍将在两个线程之间共享。

所以,通常这是一个坏主意。如果某些东西不是线程安全的,请不要在线程中使用它,但是,你可以派一个子进程然后使用它,它比线程更重,但更安全。

答案 2 :(得分:0)

如果不了解非线程安全库的具体细节,就不可能像你建议的那样使用它。

如果库有任何全局共享资源(例如全局变量),则两个线程可以互相踩踏,以图书馆编写者不想要的方式覆盖该全局变量。

麻烦的是,没有多少测试可以肯定地证明你不会最终触发冲突。

如果必须并行使用库,我能想到的唯一安全的方法是使用进程隔离...创建多个子进程,每个进程加载一个库的实例。

答案 3 :(得分:0)

只有当您知道telnet_lib_t及其方法不适用于任何全局状态(即它们不依赖于全局变量)时,您才能这样做。如果您知道库的状态包含在其中,肯定然后使用它,否则不要这样做。即使你在测试期间没有遇到任何问题,也不意味着潜伏在某个地方。