2017-02-23 100 views
0

Я сделал программу, которая имеет следующие особенности:C++ оптимизации приводит к резьбового

Это работает в классе ClassA

переменные:

int8_t* p1; // this is only modified on thread1 
volatile int8_t* p2; 

thread1 (который блокируется)

while(p1 + 64 > p2); 

thread2 (который изменяет р2)

while(true) { 
    //reading file 
    p2 += 10; 
    //reading file 
    p2 += 10; 
    //reading file 
    p2 += 10; 
} 

Thread1 в какой-то момент заблокирован. ОДНАКО, изменяя thread1 на следующий код, этот thread1 никогда не блокируется.

while(p1 + 64 > p2) { 
    printf("%d\n", p1); 
} 

Я скомпилировал этот код с -Ofast. Я думаю, проблема в оптимизации. Как я могу исправить это без изменения моих флагов компилятора?

+1

Не используйте volatile для синхронизации потоков. – knivil

ответ

3

Использовать мьютекс или использовать соответствующие атомные типы для p1 и p2. В C++ volatile не имеет определенной многопоточной семантики. Изменение обычной переменной (например, p2), в то время как другой поток может получить к ней доступ, дает непредсказуемые результаты. Не делай этого.

+0

Я сделал ошибку в коде. Изменчивая переменная была p2 не p1 – McD0n3ld

+0

Это не имеет большого значения. Не используйте 'volatile'. Используйте либо атомные типы, либо мьютексы. –

-1

p2 - переменная, измененная вне вашей первой нити, поэтому она должна быть объявлена ​​изменчивой.

Несмотря на это, скорее используйте атомы или мьютексы. volatile не защищает снова и отключает чтение и запись. На linux мьютексы очень дешевы, когда нет никаких утверждений.

+0

volatile не имеет ничего общего с синхронизацией данных по потокам. –

+0

Volatile сообщает компилятору, что адрес памяти будет изменен за пределами текущего thead, будь то аппаратное обеспечение, os или другой поток. Поэтому, хотя его использование нецелесообразно, может помочь в этом случае. – doron

+0

Конечно, волатильность может помочь в этом случае: это может временно скрыть настоящую проблему, и это, конечно же, означает, что реальная проблема проявится, когда вы демоверсии своего кода для вас самым важным клиентом; «хорошо, он работал» не будет приемлемым ответом. –