У меня должно быть мгновение, потому что это должно быть легко, но я не могу заставить его работать правильно.
Каков правильный способ применения атомного счетчика в GCC?
то есть. Мне нужен счетчик, который работает от нуля до 4 и является потокобезопасным.
Я делал это (это уже завернуто в класс, но не здесь)
static volatile int _count = 0;
const int limit = 4;
int get_count(){
// Create a local copy of diskid
int save_count = __sync_fetch_and_add(&_count, 1);
if (save_count >= limit){
__sync_fetch_and_and(&_count, 0); // Set it back to zero
}
return save_count;
}
Но он работает от 1 до 1 - 4 включительно, а затем около нуля.
Он должен идти от 0 до 3. Обычно я делаю счетчик с оператором мод, но я не
знайте, как сделать это безопасно.
Возможно, эта версия лучше. Вы можете видеть какие-либо проблемы с ним или предлагать лучшее решение.
int get_count(){
// Create a local copy of diskid
int save_count = _count;
if (save_count >= limit){
__sync_fetch_and_and(&_count, 0); // Set it back to zero
return 0;
}
return save_count;
}
Собственно, я должен указать, что не совсем важно, чтобы каждый поток получал другое значение. Если бы два потока имели одно и то же значение одновременно, это не было бы проблемой. Но они не могут превышать лимит в любое время.