簡體   English   中英

線程在pthread_create之后立即執行?

[英]Thread immediately executes after pthread_create?

創建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;
}

使用foo(...)您可以調用該函數,並將其結果傳遞給pthread_create函數。 這意味着該函數將創建任何線程之前執行。

您需要將指針傳遞給線程函數:

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

另請注意,當main函數退出時,通常會導致整個進程退出,這將殺死您已啟動的所有線程。

如果要在退出主線程后保持線程運行,則需要使用主線程中的pthread_exit分離創建的線程。

為了不立即啟動線程,IIRC可以設置屬性並將其傳遞給pthread_create函數(第二個參數)以掛起狀態啟動線程。 但是,您必須顯式恢復線程,這不會自動發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM