我对线程很陌生,我得做一个作业。我有一个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;
}
以下是我需要的两个主要的rutines:
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)”中继续递归地执行此例程,直到它到达图形的底部
if(llista[actual].id == -1)
,然后返回到第一个节点,并执行例程“buscarDespatx(i,actual)”。当它结束初始节点时,我使用pthread_exit(NULL);
终止线程。如果代码是100%正确的,我在main中创建的线程会这样运行吗?
谢谢!
最佳答案
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;
}