以下内容在与 pthreads 库链接时会死锁,如果未链接 pthreads 则不会死锁。
这是因为默认实现std::mutex::lock
does nothing.
编译器是否知道链接的库?
否:编译器只是调用std::mutex::lock
并传递给它的地址mtx
。这是执行该函数的行为不同。
Update:
澄清一下,实现是否能够根据库是否已链接来改变自身?通过宏?
当编译器完成编译时,宏预处理是also已完成并且不能产生任何进一步的影响。
也许最好的办法就是展示一下。假设您有:
int main() { return foo(); }
你能看出上面程序的执行结果是什么吗?不,你不能,因为你不知道什么foo
does.
现在假设我编译以下内容:
// foo.c
int foo() { return 0; }
gcc -c foo.c && ar ruv libfoo.a foo.o
gcc main.o -L. -lfoo
现在你可以知道程序将退出0
返回代码。
现在假设我还编译了以下内容:
// bar.c
int foo() { abort(); }
gcc -c bar.c && ar ruv libbar.a bar.o
最后,我链接相同未修改的 main.o
像这样:
gcc main.o -L. -lbar -lfoo
你能说出最终的程序会做什么吗?
你可以:它会死SIGABRT
并产生核心转储。
请注意main.o
没有改变,只有图书馆main.o
正在链接的对象已更改。
这与导致原始程序根据是否链接而表现不同的机制完全相同。libpthread
.