Я пытаюсь запустить два потока на разных процессорах, которые читают и записывают в и из общих переменных x и y, и каждый сохраняет все значения, которые они читают, в буфер. Тем не менее, при печати двух буферов я вижу, что часто один поток работает намного раньше другого, прежде чем даже другой поток начинает работать.
Можно ли как-нибудь заставить протекторы начать выполнение одновременно?
Пытаюсь использовать барьеры, но проблемы сохраняются.
typedef struct {
int *x;
int *y;
volatile int *buf;
} args;
extern void P1(void * address);
extern void P2(void * address);
void* P1_wrap(void * address) {
pthread_barrier_wait(&barrier);
P1(address);
}
void* P2_wrap(void * address) {
pthread_barrier_wait(&barrier);
P2(address);
}
int main(int argc,char *argv[]) {
int ptr1=0;
int ptr2=0;
args arg_t1;
args arg_t2;
arg_t1.x = &ptr1;
arg_t1.y = &ptr2;
arg_t2.x = &ptr1;
arg_t2.y = &ptr2;
arg_t1.buf = (volatile int*) calloc(n, sizeof(volatile int));
arg_t2.buf = (volatile int*) calloc(n, sizeof(volatile int));
pthread_barrier_init(&barrier, NULL, 3);
pthread_create(&thread1, NULL, P1_wrap, (void*)&arg_t1);
pthread_create(&thread2, NULL, P2_wrap, (void*)&arg_t2);
pthread_barrier_wait(&barrier);
pthread_join(thread1, NULL);
pthread_join(thread2, NULL);
pthread_barrier_destroy(&barrier);
for(i = 0; i < n; i++){
printf("a: %d b: %d\n", arg_t1.buf[i], arg_t2.buf[i]);
fflush(stdout);
}
free((void *)arg_t1.buf);
free((void *)arg_t2.buf);
return 0;
}