в то время как l oop читает одну и ту же переменную из 2 разных потоков, но код не работает - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь определить задержку от ядра к ядру при простом совместном использовании памяти. Моя цель - прочитать глобальную переменную из двух разных потоков. Допустим, переменная х = 0 в начале. Теперь один поток прочитает значение и изменит x на 1. Другой поток читает ту же переменную, и как только он читает x = 1, он равен 0. Я написал следующий код:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/time.h>

double getsecs(void)
{
    struct timeval tv;
    gettimeofday(&tv, NULL);
    return tv.tv_sec + tv.tv_usec / 1.0e6;
}

int x=0;
//count=0;

void* changetoone(void *arg)
{
    //sched_setaffinity(0);
    for (int i=0; i<10000; i++){
        while(x!=1)
        { 
            x=1;
            printf("%d", x);
        }
    }
    return 0;
}

void* changetozero(void *arg){
    //sched_setaffinity(5);
    for (int i=0; i<10000; i++){
        while(x!=0)
        { 
            x=0;
            printf("%d", x);
        }
    } 
    return 0;           
} 

int main()
{
    pthread_t thread1;

    pthread_create(&thread1, NULL, changetoone, &x);

    pthread_t thread2;
    pthread_create(&thread2, NULL, changetozero, &x);    

    pthread_join(&thread1, NULL);
    pthread_join(&thread2, NULL);
}

По какой-то причине код не работает. Я не знаком с использованием pthread и думаю, что сделал несколько глупых ошибок. Кто-нибудь может указать на ошибку для меня, пожалуйста?

1 Ответ

0 голосов
/ 22 февраля 2020

Первый аргумент pthread_join - pthread_t, а не pthread_t*. Поэтому не следует использовать & при вызове.

    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

Реальное поведение программы не определено из-за отсутствия синхронизации между потоками при доступе к x. Но это по крайней мере позволит потокам работать.

...