Невозможно синхронизировать выполнение потока - PullRequest
0 голосов
/ 19 апреля 2019

Я пытаюсь запустить два потока на разных процессорах, которые читают и записывают в и из общих переменных 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;
}
...