[英]C force the thread to start immediately after pthread_create. pthread_yield after 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.