C 线程在pthread_创建后立即执行?

C 线程在pthread_创建后立即执行?,c,multithreading,pthreads,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"); 在主线程函数中: void foo(pthread_t *threads, pthread_mutex_t **locks, double

当我创建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");
在主线程函数中:

void foo(pthread_t *threads, pthread_mutex_t **locks, double **transition) {
    printf("in foo\n");
}
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;
}
使用
foo(…)
调用该函数,将其结果传递给
pthread\u create
函数。这意味着函数将在创建任何线程之前执行

您需要传递指向线程函数的指针:

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

还要注意的是,当
main
函数退出时,通常会导致整个进程退出,这将终止所有已启动的线程

如果要在退出主线程后保持线程运行,则需要从主线程中使用
pthread\u exit
,并分离所创建的线程


为了不立即启动线程,IIRC有一些属性可以设置并传递给
pthread\u create
函数(第二个参数)以启动挂起的线程。但是,您必须显式地恢复线程,这不会自动发生。

当然,传递指针而不是调用函数是正确的。但它会像作者预期的那样表现吗?假设线程仍然会立即启动,而不是等待所有线程被创建。我更新了上面的代码。我之前不清楚,但是t线程是在主线程内部创建的,而不是主函数。因此,我在foo前面添加了&这个错误:“error:无法获取'void'类型的右值的地址@有时从不调用
main_-thread
函数,没有传递指向它的指针。哦,我现在看到了。因此,如果我在创建线程时传入一个指向要执行的函数的指针,该函数必须没有任何参数?现在最好的做法是将参数中的变量移动到全局变量吗?好的,没有pthread-thread属性来启动挂起的线程。线程总是立即启动(或按计划启动),并且不保证先运行子线程或先运行父线程。如果你想要它,你需要一个信号灯。欢迎来到SO。请始终向我们展示真实代码。不是你自己编出来的或是从你的脑海里重打出来的。此代码不完整,无法编译。括号不匹配。我们不知道您是否意外地在函数名后添加了
(…)
,或者这是否真的是您的代码。答案在很大程度上取决于此。“一旦主线程退出,我希望其中一个T线程执行。”-我可能误解了您的意图,但听起来您一次只希望执行一个线程。如果是这样,为什么还要麻烦线程呢?为什么不在
main
中连续调用
main\u线程
foo
函数?可能的重复等。