(C)pthread在创建后立即执行

时间:2018-11-30 07:40:18

标签: c multithreading pthreads

创建T线程时,主线程中包含以下代码。

pthread_t threads[T];
for (a=0; a<T; a++) {
    pthread_create(&(threads[a]), NULL, foo(threads, locks, transition), NULL);
}
printf("in main thread\n");

它创建了第一个线程,我注意到它立即开始执行第一个线程。在第一个线程中调用foo,在此之后输出“在主线程中”。我的实际目的是先创建所有T线程(将线程推入“就绪”队列),然后继续在主线程中执行代码,直到退出或屈服为止。主出口退出后,我要执行T个线程之一。

在foo函数中:

void foo(pthread_t *threads, pthread_mutex_t **locks, double **transition) {
    printf("in foo\n");
}

在main_thread函数中:

void main_thread (int *N, int *T) {
    double **transition;
    pthread_mutex_t **locks;

    transition = malloc(*N * sizeof *transition);
    locks = malloc(*N * sizeof *locks);
    for (a=0; a< *N; a++) {
        transition[a] = malloc(*N * sizeof *transition[a]);
        locks[a] = malloc(*N * sizeof *locks[a]);
    }

    // lock for each element in transition matrix
    for (a=0; a<*N; a++) {
        for (b=0; b<*N; b++) {
            if (pthread_mutex_init(&(locks[a][b]), NULL) != 0) { 
                printf("\n mutex init has failed\n"); 
            }
        }
    }

    for (a=0; a<*N; a++) {
        for (b=0; b<*N; b++) {
            transition[a][b] = 0.0;
        }
    }

    pthread_t threads[T];
    for (a=0; a<T; a++) {
        pthread_create(&(threads[a]), NULL, foo(threads, locks, transition), NULL);
    }
    printf("in main thread\n");


}

在主要功能中:

int main(int argc, char *argv[]) {

    int N = 4;
    int T = 2;

    pthread_t main_t;
    pthread_create(&main_t, NULL, &main_thread(&N, &T), NULL); 

    return 0;
}

1 个答案:

答案 0 :(得分:2)

使用foo(...),您 调用 该函数,并将其结果传递给pthread_create函数。这意味着该函数将在创建任何线程之前执行

您需要将指针传递给线程函数:

pthread_create(&threads[a], NULL, foo, NULL);

还要注意,main函数退出时,通常会导致整个进程退出,这将杀死您已启动的所有线程。

如果要在退出主线程之后保持线程运行,则需要从主线程中使用pthread_exit,然后 detach 创建。

为了不立即启动线程,IIRC提供了一些属性,您可以设置这些属性并将其传递给pthread_create函数(第二个参数)以挂起状态启动线程。不过,您必须明确地恢复线程,这不会自动发生。