剛剛遇到了有關如何將第四個參數傳遞給pthread_create()的奇怪問題。指向pthread_create()的最後一個參數的指針導致崩潰
本來,我寫的代碼如下:
auditLogEntry *newEntry = NULL;
// malloc and init the memory for newEntry
rc = audit_init_log_entry(&newEntry);
// wrapper of 'goto cleanup'
ERR_IF(rc != 0);
...
rc2 = pthread_attr_init(&attr);
ERR_IF(rc2 != 0);
rc2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ERR_IF(rc2 != 0);
rc2 = pthread_create(&syslog_thread, &attr, syslog_thread_handler, (void *)newEntry);
ERR_IF(rc2 != 0);
newEntry = NULL;
...
cleanup:
pthread_attr_destroy(&attr);
if (newEntry != NULL)
{
audit_free_log_entry(newEntry);
newEntry = NULL;
}
static void *syslog_thread_handler(void *t)
{
auditLogEntry *entry = (auditLogEntry *)t;
... // code using entry
cleanup:
audit_free_log_entry(entry);
pthread_exit(0);
}
,一切工作正常。
於是,我做了一個變化:
rc2 = pthread_create(&syslog_thread, &attr, syslog_thread_handler, (void *)&newEntry);
ERR_IF(rc2 != 0);
...
cleanup:
pthread_attr_destroy(&attr);
if (rc != 0 && newEntry != NULL)
{
audit_free_log_entry(newEntry);
newEntry = NULL;
}
static void *syslog_thread_handler(void *t)
{
auditLogEntry **entry = (auditLogEntry **)t;
... // code using *entry
cleanup:
audit_free_log_entry(*entry);
*entry = NULL;
pthread_exit(0);
}
線程處理器將使用*進入訪問日誌條目數據,上述變更後。但它沒有奏效。更糟糕的是,流程核心傾倒。
我試過'man pthread_create',但沒有發現如何將最後一個參數傳遞給它。
我的任何錯誤,在這裏?
所以爲什麼要改變呢?它在一開始就工作正常,這是一個明智的做事方式。如果它有效,那麼改變它的原因是什麼? – mathematician1975 2012-08-08 15:21:06
@ mathematician1975:我想回收線程處理程序中的內存,然後將*條目設置爲NULL。所以父進程不會有雙入口指針的危險。 – 2012-08-08 15:35:22
好吧,你的問題並不完全清楚。 – mathematician1975 2012-08-08 15:50:01