IPC через общую память с atomic_t; хорошо ли это для x86?

У меня есть следующий код для межпроцессного взаимодействия через общую память. Один процесс пишет в журнал, а другой читает из него. Один из способов - использовать семафоры, но здесь я использую атомарный флаг (log_flag) типа atomic_t, который находится внутри общей памяти. Журнал (log_data) также является общим.

Теперь вопрос, будет ли это работать на архитектуре x86 или мне нужны семафоры или мьютексы? Что если я сделаю log_flag неатомарным? Учитывая, что x86 имеет строгую модель памяти и проактивную когерентность кэша, а оптимизация не применяется к указателям, я думаю, это все равно будет работать?

EDIT: Обратите внимание, что у меня многоядерный процессор с 8 ядрами, поэтому у меня нет проблем с занятыми ожиданиями!

// Process 1 calls this function
void write_log( void * data, size_t size )
{
    while( *log_flag )
           ;
    memcpy( log_data, data, size );
    *log_flag = 1;
}

// Process 2 calls this function
void read_log( void * data, size_t size )
{
    while( !( *log_flag ) )
       ;
    memcpy( data, log_data, size );
    *log_flag = 0;
}
10
задан MetallicPriest 3 January 2012 в 12:08
поделиться