0

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

IE:

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);
}

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

4

4 回答 4

1

不,你不能这样做。如果库没有全局状态并且它的函数只是内部非线程安全的,您可以通过让整个库受互斥锁保护并且只允许一个线程一次访问它来解决问题(但这可能会令人望而却步,特别是如果库执行任何缓慢或阻塞的任务)。但是,如果库从根本上具有它使用的单一全局状态,并且无法保存/恢复/交换状态,那么根本无法在多个线程中使用它(甚至无法在非线程程序中交替使用多个上下文)。这样的库通常被认为是垃圾,应该被替换。

于 2012-04-04T01:31:57.643 回答
0

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

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

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

于 2012-04-04T01:31:10.013 回答
0

如果不了解更多关于非线程安全库的细节,就不可能按照您的建议说它是安全的。

如果库有任何全局共享资源(例如全局变量),两个线程很可能会互相踩踏,以库编写者不希望的方式覆盖该全局变量。

问题是,再多的测试都无法确定您最终不会引发冲突。

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

于 2012-04-04T01:31:18.283 回答
0

只有当您知道 thetelnet_lib_t及其方法不适用于任何全局状态(即它们不依赖于全局变量)时,您才能这样做。如果您知道库的状态包含在其内部, 请确保使用它,否则不要这样做。即使您在测试过程中没有遇到任何问题,也并不意味着某个地方没有问题。

于 2012-04-04T01:35:30.667 回答