AFAIK C++ atomik (<atomic>
) ailesinin 3 avantajları sağlar:C++ atomik ve çapraz iplik görüş
- ilkel talimatları bölünmez (hiçbir kirli okur),
- bellek sipariş (her ikisi de, CPU ve derleyici) ve Çapraz iş parçacığı görünürlüğü/değişimi yayılımı
- .
Ayrıca üçüncü mermi hakkında emin değilim, bu nedenle aşağıdaki örneğe bakın.
#include <atomic>
std::atomic_bool a_flag = ATOMIC_VAR_INIT(false);
struct Data {
int x;
long long y;
char const* z;
} data;
void thread0()
{
// due to "release" the data will be written to memory
// exactly in the following order: x -> y -> z
data.x = 1;
data.y = 100;
data.z = "foo";
// there can be an arbitrary delay between the write
// to any of the members and it's visibility in other
// threads (which don't synchronize explicitly)
// atomic_bool guarantees that the write to the "a_flag"
// will be clean, thus no other thread will ever read some
// strange mixture of 4bit + 4bits
a_flag.store(true, std::memory_order_release);
}
void thread1()
{
while (a_flag.load(std::memory_order_acquire) == false) {};
// "acquire" on a "released" atomic guarantees that all the writes from
// thread0 (thus data members modification) will be visible here
}
void thread2()
{
while (data.y != 100) {};
// not "acquiring" the "a_flag" doesn't guarantee that will see all the
// memory writes, but when I see the z == 100 I know I can assume that
// prior writes have been done due to "release ordering" => assert(x == 1)
}
int main()
{
thread0(); // concurrently
thread1(); // concurrently
thread2(); // concurrently
// join
return 0;
}
Öncelikle kodunda (özellikle thread2
) benim varsayımları doğrulamak ediniz.
İkincisi, benim sorular şunlardır:
Nasıl
a_flag
diğer çekirdeklere yaymak yazar?std::atomic
diğer çekirdekler önbelleği ile yazar önbelleğindea_flag
senkronize mu(mesi kullanarak veya başka bir şey) ya da yayılma otomatiktir?
Belli bir makinede bir bayrak için yazının atomik olduğunu varsayın (x86'da int_32'yi düşünün) VE Senkronize edilmek üzere özel bir belleğimiz yok (yalnızca bir bayrağa sahibiz) atomik kullanmamız gerekecek mi?
dikkate alarak en popüler işlemci mimarisi (86, IA-64 KOL v.whatever 64), (ama potansiyel olarak gecikmiş) otomatik çapraz çekirdek görüş (şimdi değil dikkate reorderings AM), veya herhangi bir veri parçasını yaymak için belirli komutlar vermeniz gerekiyor mu? kendileri önemi yok