2011-08-10 80 views
1

我在頭文件中創建了dispatch_queue_thread_t結構體。
該代碼分配線程,任務和隊列的dThread結構c,創建線程和線程函數

dispatch_queue_thread_t *dThread; 
dThread = (dispatch_queue_thread_t *) malloc(sizeof(dispatch_queue_thread_t)); 

pthread_t dispatcher_thread; 

if(pthread_create(&dispatcher_thread, NULL, dispatcher_threadloop, (void *)dispatch_queue)){ 
     perror("ERROR creating thread."); exit(EXIT_FAILURE); 
} 

dThread->task=NULL; 
dThread->queue=dispatch_queue; 
dThread->thread=dispatcher_thread; 

該代碼可用於dispatcher_thread線程功能。
我需要在dThread中使用線程來檢查是否有任何任務分配給它,如果不需要將任務分配給它。
我該怎麼做? 我的代碼是否正確?

void *dispatcher_threadloop(void * queue){ 

//thread loop of the dispatch thread- pass the tast to one of worker thread 
dispatch_queue_t *dQueue; 
dQueue=queue; 

//can I do this? 
dispatch_queue_thread_t *dThread; 

printf("message-boss1"); 
dQueue = (dispatch_queue_t *)queue; 
if (dQueue->HEAD!=NULL){ 
    for(;;){ 
     sem_wait(dQueue->queue_task_semaphore); 
     dThread->task = dQueue->HEAD; 
     dQueue->HEAD = dQueue->HEAD->next; 
     dQueue->HEAD->prev = NULL; 
     sem_post(dQueue->queue_task_semaphore); 

     //TODO 
    } 
} 

printf("message-boss2"); 

} 

回答

4

號在dispatcher_threadloop()dThread變量將不會被初始化,所以這是一個錯誤取消對它的引用。

看來你應該將dThread傳遞給線程函數而不是dispatchQueue,因爲線程函數可以從前者獲得後者。像這樣的東西(注意,鑄造,並從void *是不必要的):

dispatch_queue_thread_t *dThread; 
dThread = malloc(sizeof *dThread); 

dThread->task = NULL; 
dThread->queue = dispatch_queue; 

if (pthread_create(&dThread->thread, NULL, dispatcher_threadloop, dThread)) { 
    perror("ERROR creating thread."); 
    exit(EXIT_FAILURE); 
} 

然後在線程函數:

void *dispatcher_threadloop(void *arg) 
{ 
    dispatch_queue_thread_t *dThread = arg; 
    dispatch_queue_t *dQueue = dThread->queue; 

    /* ... */ 
+0

的偉大工程,感謝名單 – Leanne