[英]dlopen() in multithreaded application exit with “Trace/BPT trap”
我試圖在運行時使用以下命令在用C編寫的Mac OS X應用程序中加載框架:
dlopen("/System/Library/Frameworks/JavaVM.framework/JavaVM",RTLD_LAZY);
如果我從主線程調用dlopen()
,它將按預期工作。
當我從另一個線程調用它時,應用程序退出並出現錯誤: Trace/BPT trap
這是從主線程調用dlopen()
的代碼(起作用):
int main(int argc, char** argv)
{
void *result = dlopen("/System/Library/Frameworks/JavaVM.framework/JavaVM",RTLD_LAZY);
if (!result) {
printf("can't open library JavaVM: %s\n", dlerror());
}
else {
printf("library JavaVM loaded\n");
}
return 0;
}
輸出為: 庫JavaVM已加載
這是從另一個線程調用dlopen()
的代碼(並在對該函數的調用期間退出):
void *loadJava(void* arg)
{
void *result = dlopen("/System/Library/Frameworks/JavaVM.framework/JavaVM",RTLD_LAZY);
if (!result) {
printf("can't open library JavaVM: %s\n", dlerror());
}
else {
printf("library JavaVM loaded\n");
}
}
int main(int argc, char** argv)
{
pthread_t vmthread;
struct rlimit limit;
size_t stack_size = 0;
int rc = getrlimit(RLIMIT_STACK, &limit);
if (rc == 0) {
if (limit.rlim_cur != 0LL) {
stack_size = (size_t)limit.rlim_cur;
}
}
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_attr_setscope(&thread_attr, PTHREAD_SCOPE_SYSTEM);
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
if (stack_size > 0) {
pthread_attr_setstacksize(&thread_attr, stack_size);
}
pthread_create(&vmthread, &thread_attr, loadJava, NULL);
pthread_attr_destroy(&thread_attr);
pthread_exit(NULL);
return 0;
}
輸出為: Trace / BPT陷阱
錯誤在哪里? 抱歉,這是一個愚蠢的問題,但我還是新手
似乎dlopen()並不是線程安全的,因此您不應在多個線程下調用它。
也許不是dlopen()也不是線程安全的,而是庫的初始化代碼在加載時運行。
沒有理由在線程下調用dlopen,因為它不會多次加載該庫。
當您多次加載同一文件時,則第二次不執行任何操作(除了增加一些引用計數),並且僅返回相同的句柄。 因此,通過每個線程加載它不會獲得任何收益。
您可以使用dlmopen()多次真正加載一個庫。 但這僅限於15次。
即使這樣,您也應該在啟動線程之前(在每個線程中為其提供庫句柄)在main()中進行操作,而不是從線程內部進行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.