pthreads的问题

时间:2014-12-07 16:01:04

标签: c multithreading pthreads

我对线程很新,我必须做一个任务。我有一个6个节点的图表,我应该创建从第一个节点移动到最后一个节点的线程。除了需要在线程中完成的部分外,我已经完成了所有设置。我在互联网上阅读了一些教程但是还不够,我遇到了一些问题,我不明白为什么。无论如何,这是代码:

int main (void) {

    pthread_t threads[NUM_THREADS];
    int i = 0, rc, a = 0;
    creatGraph();
    rc = pthread_create(&threads[i], NULL, buscarExp(i,0), NULL);
    if (rc) {
        printf("ERROR al crear el funcionari %d\n,",i);
        exit(-1);
    }
    pthread_exit(NULL);
    return 0;
}

以下是我需要的两个主要条款:

    void buscarDespatx(int i, int actual) {
        if(llista[actual].id == 0) {    // ja hem arribat al despatx
            pthread_exit(NULL);
            //buscarExp(i,actual); // el funcionari ha deixat l'expedient i va a buscar-ne un altre
        } else {    // no ha arribat al despatx
            int seguent = rand() % llista[actual].Npares; // trio el node pare de tots els nodes pares q tindra
            llista[actual].Proces[llista[actual].membres] = 0; // trec el proces del node actual
            llista[actual].membres--; // decremento el nombre de processos al noded actual
            llista[llista[actual].pares[seguent]].membres++; // incremento el nombre de processos del node pare al que anira el proces actual
            llista[llista[actual].pares[seguent]].Proces[llista[llista[actual].pares[seguent]].membres] = i; // afegeixo el proces actual a la llista de processos del node pare que anira el proces
            buscarDespatx(i,llista[llista[actual].pares[seguent]].id);
            printf("BUSCAR EXP: El node %d ha estat modificat i ha marxat el proces %d\n",actual,i);
        }
    }

void buscarExp(int i, int actual) {
    if(llista[actual].id == -1) {   // ja hem arribat al expedient
        buscarDespatx(i,actual); // el funcionari te l'expedient i el va a deixar al despatx
    } else {    // no ha arribat a l'expedient
        int node = 0;
        if(llista[actual].dret != NULL) {   // aquest node te dos fils
            int seg = rand();
            if(seg%2 == 0) {    // avança pel fill esq
                llista[actual].esq->membres++;  // sumo un membre al seguent node
                llista[actual].esq->Proces[llista[actual].esq->membres] = i;    // poso el proces al seguent node
            } else { // avanço pel fill dret
                node = 1;
                llista[actual].dret->membres++; // sumo un membre al seguent node
                llista[actual].dret->Proces[llista[actual].dret->membres] = i;  // poso el proces al seguent node
            }
        } else {    // nomes te fill esquerra
            llista[actual].esq->membres++;  // sumo un membre al seguent node
            llista[actual].esq->Proces[llista[actual].esq->membres] = i;    // poso el proces al seguent node
        }
        llista[actual].Proces[llista[actual].membres] = 0;      // elimino el funcionari del node actual
        llista[actual].membres--;
        printf("BUSCAR EXP: El node %d ha estat modificat i ha marxat el proces %d\n",actual,i);
        if(node == 1) { // ha passat pel dret
            buscarExp(i,llista[actual].dret->id);
        } else { // passa per l'esquerra
            buscarExp(i,llista[actual].esq->id);
        }
    }
}

所以,如果我理解线程是如何工作的,那么应该执行以下操作: 'main'创建pthread,它开始执行路由“buscarExp(i,0)”,然后在“buscarExp(i,0)”中,它继续递归地执行此例程,直到它到达图形的底部{{1}然后它返回到具有例程“buscarDespatx(i,actual)”的第一个节点。当它填充初始节点时,我使用if(llista[actual].id == -1)来终止线程。

如果代码100%正确,那么我在main中创建的线程是如何表现的?

谢谢!

1 个答案:

答案 0 :(得分:2)

rc = pthread_create(&threads[i], NULL, buscarExp(i,0), NULL);

不会起作用。如果查看pthread_create的文档,您会看到第三个参数(start_routine)应该是一个函数指针。但是,您的代码首先调用 buscarExp(i,0),然后尝试将该(错误输入的)结果作为线程函数传递给pthread_create

您需要将具有兼容签名的函数传递给pthread_create,并使用void*将其传递给任何其他参数。

此外,您的主要线程立即退出,这是一个问题,因为我传递的数据存在于main()的堆栈中。最有可能的是,您希望在启动它们之后使用所有线程pthread_join

这样的事情:

struct thread_data {
    int thread_num;
    // Other things you want to pass here
}

void *thread_func(void *_data) {
    struct thread_data *data = _data;

    buscarExp(data->thread_num, 0)
}

int main (void) {

    pthread_t threads[NUM_THREADS];
    struct thread_data thread_data[NUM_THREADS];

    int i = 0, rc, a = 0;

    creatGraph();

    /* Start all threads */
    for (i=0; i<NUM_THREADS; ++i) {
        thread_data[0].thread_num = i;
        rc = pthread_create(&threads[i], NULL, thread_func, &thread_data[i]);
        if (rc) {
            printf("ERROR al crear el funcionari %d\n,",i);
            exit(-1);
        }
    }

    /* Wait for all threads to finish */
    for (i=0; i<NUM_THREADS; ++i) {
        pthread_join(&threads[i], NULL);
    }
    return 0;
}