с, создание потока и функции потока - PullRequest
1 голос
/ 10 августа 2011

Я создал структуру dispatch_queue_thread_t в заголовочном файле.Этот код назначает поток, задачу и очередь структуре dThread

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");

}

1 Ответ

4 голосов
/ 10 августа 2011

Нет. Переменная dThread в dispatcher_threadloop() не инициализирована, поэтому ее разыменование является ошибкой.

Кажется, что вы должны передавать 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;

    /* ... */
...