동기화가 그런식으로 일어나는게 아님. release-acquire는 release 하는 애가 쓰기 전에 만든 이벤트들을 acquire 하는 애가 값을 읽은 후에 볼 수 있다는 보장밖에 안해줌.
다믜(damhiya)2024-09-20 20:39
답글
x랑 y에 쓰는게 서로 다른 쓰레드니까 어떤애는 x y 순으로 관측하고 다른애는 y x 순으로 관측할 수도 있음
다믜(damhiya)2024-09-20 20:40
답글
c쓰레드가 x y순으로 관측하고d쓰레드가 y x순으로 관측하면 z: 0이 될 수 있을거 같은데이게 가능함?a쓰레드가 완료되면 c,d쓰레드에서는 무조건 x = true일텐데a스레드에서 x.store(release)을 완료하고다른 쓰레드에서 x.load(acquire)하면 무조건 x = true아님?어떻게 z: 0이될 수 있지...
익명(115.92)2024-09-20 21:01
답글
일단 어떤 atomic를 release했으면 그 쓰레드에서 release이전에 메모리 변경점(atomic아닌 변수 포함)에 대해
acquire하는 쪽에서 모두 관찰 할 수 있다는걸로 알고있는데 ㅠㅠ
cppreference읽어봐도 도저히 모르겠네
익명(115.92)2024-09-20 21:04
뭐 맹그는거야?
익명(182.211)2024-09-20 21:40
z=0이 될수 있는 이유는 read_then 함수를 실행하는 각 쓰레드가 관찰하는 x 또는 y의 캐시 일관성은 서로 독립이기 때문임. 다시말해서 두 쓰레드가 x를 load하거나 y를 load하는 순서는 보장되지 않음.
익명(14.38)2024-09-21 01:58
cpu1 a->c
cpu2 b->d면 0이 나올 수 있음 release- accquire은
store이전 상황이 load전에 보이는걸 보장하고 다른 스레드에 일어났는지를 다른 스레드에 보여주질 않아서 0이 안 나오려면order_seq_cst를 써야함
동기화가 그런식으로 일어나는게 아님. release-acquire는 release 하는 애가 쓰기 전에 만든 이벤트들을 acquire 하는 애가 값을 읽은 후에 볼 수 있다는 보장밖에 안해줌.
x랑 y에 쓰는게 서로 다른 쓰레드니까 어떤애는 x y 순으로 관측하고 다른애는 y x 순으로 관측할 수도 있음
c쓰레드가 x y순으로 관측하고d쓰레드가 y x순으로 관측하면 z: 0이 될 수 있을거 같은데이게 가능함?a쓰레드가 완료되면 c,d쓰레드에서는 무조건 x = true일텐데a스레드에서 x.store(release)을 완료하고다른 쓰레드에서 x.load(acquire)하면 무조건 x = true아님?어떻게 z: 0이될 수 있지...
일단 어떤 atomic를 release했으면 그 쓰레드에서 release이전에 메모리 변경점(atomic아닌 변수 포함)에 대해 acquire하는 쪽에서 모두 관찰 할 수 있다는걸로 알고있는데 ㅠㅠ cppreference읽어봐도 도저히 모르겠네
뭐 맹그는거야?
z=0이 될수 있는 이유는 read_then 함수를 실행하는 각 쓰레드가 관찰하는 x 또는 y의 캐시 일관성은 서로 독립이기 때문임. 다시말해서 두 쓰레드가 x를 load하거나 y를 load하는 순서는 보장되지 않음.
cpu1 a->c cpu2 b->d면 0이 나올 수 있음 release- accquire은 store이전 상황이 load전에 보이는걸 보장하고 다른 스레드에 일어났는지를 다른 스레드에 보여주질 않아서 0이 안 나오려면order_seq_cst를 써야함