Я нахожу странное явление при использовании глобальной переменной в качестве параметра в C++. Вот код. Программа никогда не закончится при использовании -O2.Как запретить компиляцию C++ при использовании глобальной переменной в качестве параметров
#include <thread>
#include <iostream>
using namespace std;
#define nthreads 2
struct Global{
int a[nthreads];
};
void func(int* a){
while(*a == 0){
}
cout << "done" << endl;
}
struct Global global;
int main(){
thread pid[nthreads];
memset(global.a, 0, nthreads*sizeof(int));
for(int i=0; i<nthreads; i++){
pid[i] = std::thread(func, &global.a[i]);
}
sleep(2);
cout << "finished" << endl;
memset(global.a, 1, nthreads*sizeof(int));
for(int i=0; i<nthreads; i++){
pid[i].join();
}
return 0;
}
При использовании -O0 все выглядит нормально. И распечатать переменную * a во время цикла, это все еще нормально.
Так что, я думаю, это должна быть проблема оптимизации на C++. Но как мог компилятор сделать такую агрессивную оптимизацию для глобальной переменной и многопоточной?
Спасибо за все ответы и комментарии, я попытался использовать volatile, и он действительно работает. Я не хочу использовать мьютексы, потому что использование мьютекса в каждом цикле влияет на производительность.
На самом деле, я хочу сделать что-то вроде этого:
Рабочего потока петли через глобальный список и делает некоторое выполнение в каждом цикле в то время как (я не хочу использовать семафор здесь, потому что. это не имеет значения, даже если ошибка происходит только в одном цикле)
Некоторые другие потоки, возможно, добавлять элементы в этот список. (мьютекс используется здесь нормально. потому что каждый поток только добавляет один раз)
Что мне делать правильно?
Там нет смысла использовать мьютекс лишь один из двух потоков - это в буквальном смысле механизм MUTual EXclusion. Не работает только с одной стороны. – MSalters
На последней части то, что вы описываете, называется шаблоном производителя-потребителя. Вы можете посмотреть в [Boost LockFree] (http://www.boost.org/doc/libs/1_61_0/doc/html/lockfree.html), который предназначен для таких шаблонов. – MSalters