Eu estava usando vector<atomic<bool>>
em C++, o código está aqui:
#include <iostream>
#include <thread>
#include <atomic>
#include <vector>
using namespace std;
int main() {
int n = 10;
int count = 20;
vector<atomic<bool>> flags(n);
vector<thread> jobs;
for (int i = 0; i < count; i++) {
jobs.emplace_back([&](){
bool old_val = false;
for (int i = 0; i < n; i++) {
if (flags[i].compare_exchange_strong(old_val, true)) {
cout<<1;
break;
}
}
});
}
for (int i = 0; i < count; i++) {
jobs[i].join();
}
return 0;
}
Não sei por que, não importa qual count
seja o valor da variável, o conteúdo de saída é sempre "11111", o que significa que compare_exchange_strong()
só é bem-sucedido 5 vezes, metade do comprimento do arquivo vector<atomic<bool>>
.
Espero que a saída seja 1111111111
(dez 1s).
Alguém pode me dizer o porquê? Obrigado!!!!
Você está reutilizando a mesma variável para cada troca, então se
flags[i]
estivertrue
na primeira iteração,old_flags
estarátrue
na segunda.Então, se
flags[i]
estiverfalse
na terceira iteração,old_flags
torna-sefalse
novamente.Esse flip-flop significa que você modifica apenas todos os outros elementos em
flags
.Mova a declaração
bool old_val = false;
dentro do loop.Seus threads estão competindo entre si, mas não por motivos de segurança de thread. O que vemos é uma estatística perfeitamente matemática de mudança de valor para “sim” e “não” (e às vezes isso é feito intencionalmente).
Saída:
Você vê o que está acontecendo?
compare_exchange_strong
teve um efeito colateral em seu argumento, ele salvou o valor detectado. É uma corrida estadual (não confundir com condição de corrida).Seu código deve ser: