Когда я создаю потоки 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;
}