0

我正在为一个根本维护得不好的旧项目进行构建;它或多或少是由数百个独立项目拼凑而成的大杂烩。当然,这意味着发生了很多不恰当的事情。

可能有 50-100 个可执行文件,以及大约 300 个共享/静态库。一些库是使用-mt标志构建的(sun studio;-pthreads似乎是 gcc 等效项),而其他库则不是。

这对我来说似乎有潜在的问题。假设我有libA.so- libB.soA-mt构建的,但不是B。我希望与A & B链接的应用程序是单线程的,不会有任何问题(请随时纠正我)。但是,如果应用程序是线程化的,那么这种情况会带来一堆有趣的蠕虫。

我倾向于使用-mt构建所有内容并完成它。办公室的大多数人都同意这个计划,但有一个反对者。我的期望是,这只会造成性能的潜在下降,但由于该项目的糟糕状态,目前性能已经很糟糕了;所以我对此并不担心。

简而言之:这样做有什么潜在的陷阱吗?

4

1 回答 1

2

我希望那些积极关心用线程编译的库会出现问题(这是#ifdef _REENTRANT它的一个标志)。当一些代码长时间没有编译,突然变得活跃时,它的问题可能会变得明显。(它甚至与线程无关,只是很长一段时间内被排除在外的任何代码)。

上面的一个特例是一个库,它试图以这里pthread_atfork的 RATIONALE 部分中描述的方式使用:这些事情远没有很好地定义,正因为创建线程、释放锁等不是异步信号安全的。您的平台可能会为实际发生的情况提供一些保证(例如,它甚至可能指定是否为信号处理程序中的发生调用 atfork 处理程序)。这个东西如果没有实际使用应该无关紧要,否则它有一个真正的行为不端的机会。forkfork

总结:不要指望那些不关心线程的库会出现很多问题。期望它们来自关心并且(可能在某些情况下)做错了的图书馆。

于 2013-01-30T22:43:25.133 回答