C - повторное использование функции pthread - локальные переменные и условия гонки - PullRequest
1 голос
/ 20 июля 2011

Если я определю функцию потока, которая повторно использует другую функцию, которую также использует основной поток .... возможно ли, что может быть условие гонки?Распределены ли локальные переменные в одной и той же функции между потоками?В этом случае функция do_work используется как в потоке thread_one, так и в основном потоке.Может ли локальная переменная x в функции do_work быть изменена обоими потоками, чтобы получить неожиданный результат?

void *thread_one() {
   int x = 0;
   int result;
   while(1) {
       for(x=0; x<10; x++) {
           result = do_work(x);
       }
       printf("THREAD: result: %i\n", result);
   }
}

int do_work(int x) {
    x = x + 5;
    return x;
}

int main(int argc, char**argv) {
    pthread_t the_thread;
    if( (rc1 = pthread_create( &the_thread, NULL, thread_one, NULL)) ) {
        printf("failed to create thread %i\n", rc1);
        exit(1);
    }
    int i = 0;
    int result = 0;
    while(1) {
        for(i=0; i<12; i+=2) {
            result = do_work(i);
        }
        printf("MAIN: result %i\n", result);
    }
    return 0;
}    

Ответы [ 4 ]

5 голосов
/ 20 июля 2011

Нет .Локальные переменные не являются общими для всех потоков.

3 голосов
/ 20 июля 2011

Нет, локальные переменные потока не распределяются между потоками.

Подробно, каждый поток имеет свой собственный набор регистров и стек.Тем не менее, код и глобальные данные являются общими.

1 голос
/ 20 июля 2011

Нет, и более важным моментом является то, что локальные (автоматические) переменные не используются совместно несколькими экземплярами функции даже в одном потоке .Вот как работает рекурсия и что делает возможным возврат функций.

1 голос
/ 20 июля 2011

Нет, поскольку x является локальной переменной.Каждый поток работает со своей собственной переменной x, поэтому у потока нет возможности изменить x.

другого потока.
...