Может ли компилятор C / C ++ законно кэшировать переменную в регистре при вызове библиотеки pthread?

Предположим, что у нас есть следующий фрагмент кода:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

void guarantee(bool cond, const char *msg) {
    if (!cond) {
        fprintf(stderr, "%s", msg);
        exit(1);
    }
}

bool do_shutdown = false;   // Not volatile!
pthread_cond_t shutdown_cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t shutdown_cond_mutex = PTHREAD_MUTEX_INITIALIZER;

/* Called in Thread 1. Intended behavior is to block until
trigger_shutdown() is called. */
void wait_for_shutdown_signal() {

    int res;

    res = pthread_mutex_lock(&shutdown_cond_mutex);
    guarantee(res == 0, "Could not lock shutdown cond mutex");

    while (!do_shutdown) {   // while loop guards against spurious wakeups
        res = pthread_cond_wait(&shutdown_cond, &shutdown_cond_mutex);
        guarantee(res == 0, "Could not wait for shutdown cond");
    }

    res = pthread_mutex_unlock(&shutdown_cond_mutex);
    guarantee(res == 0, "Could not unlock shutdown cond mutex");
}

/* Called in Thread 2. */
void trigger_shutdown() {

    int res;

    res = pthread_mutex_lock(&shutdown_cond_mutex);
    guarantee(res == 0, "Could not lock shutdown cond mutex");

    do_shutdown = true;

    res = pthread_cond_signal(&shutdown_cond);
    guarantee(res == 0, "Could not signal shutdown cond");

    res = pthread_mutex_unlock(&shutdown_cond_mutex);
    guarantee(res == 0, "Could not unlock shutdown cond mutex");
}

Может ли C Компилятор / C ++ когда-либо кэшировал значение do_shutdown в регистре при вызове pthread_cond_wait () ? Если нет, то какие стандарты / пункты гарантируют это?

Компилятор может гипотетически знать, что pthread_cond_wait () не изменяет do_shutdown . Это кажется маловероятным, но я не знаю ни одного стандарта, который бы этому препятствовал.

На практике, кэшируют ли какие-либо компиляторы C / C ++ значение do_shutdown в регистре при вызове pthread_cond_wait () ?

При вызове какой функции компилятор гарантированно не кэширует значение do_shutdown через? Понятно, что если функция объявлена ​​извне и компилятор не может получить доступ к ее определению, он не должен делать никаких предположений о ее поведении, чтобы не доказать, что он не обращается к do_shutdown . Если компилятор может встроить функцию и доказать, что он не имеет доступа к do_shutdown , тогда может ли он кэшировать do_shutdown даже в многопоточном режиме? Как насчет не встроенной функции в том же модуле компиляции?

9
задан Tim Maxwell 18 December 2010 в 03:26
поделиться