Мьютексы сами по себе не подходят для выполнения требуемого тесно взаимосвязанного исполнения - их обычное использование - для защиты доступа к общей структуре данных.Это потому, что они предназначены для того, чтобы сказать «Вещь А не должна происходить одновременно с Вещью В» , но они ничего не говорят о том, произойдет ли Вещь А или Вещество B первым или вторым.
Вы можете использовать мьютексы и условные переменные, но в этом случае ваша проблема наиболее близко соответствует объекту pthreads Barrier:
#include <stdio.h>
#include <pthread.h>
pthread_barrier_t barrier;
void *print_message_function( void *str )
{
char *message;
message = (char *) str;
pthread_barrier_wait(&barrier); /* Barrier point 1 */
/* (wait until parent prints first message) */
printf("Child 1 received message: %s \n", message);
pthread_barrier_wait(&barrier); /* Barrier point 2 */
/* (allow parent to proceed and print second message) */
pthread_barrier_wait(&barrier); /* Barrier point 3 */
/* (wait for parent to print second message) */
printf("child 2\n");
return NULL;
}
int main()
{
pthread_t thread1;
char *message1 = "Thread 1";
int r;
pthread_barrier_init(&barrier, NULL, 2);
r = pthread_create( &thread1, NULL, print_message_function, (void*) message1);
printf("Parent 1\n");
pthread_barrier_wait(&barrier); /* Barrier point 1 */
/* (allow child to proceed and print first message) */
pthread_barrier_wait(&barrier); /* Barrier point 2 */
/* (wait for child to print first message) */
printf("Parent 2\n");
pthread_barrier_wait(&barrier); /* Barrier point 3 */
/* (allow child to proceed and print second message) */
pthread_join( thread1, NULL);
/* (wait for child to exit) */
printf("Thread 1 returns: %d\n",r);
return 0;
}
Обратите внимание, что это , а не обычно стараются жестко заблокировать выполнение потоков таким образом - действительно, вы приложили большие усилия, чтобы гарантировать, что потоки вообще не будут выполняться параллельно, что является главной целью потоков в первую очередь.Если вы обнаружите, что делаете это в реальном проекте, это признак того, что вам следует тщательно переосмыслить свой дизайн.