Concurrent2

Access to a shared variable

คือ function main สร้าง new thread มา 2 ตัว ใช่มั๊ยนะ
ลองกด run รัวๆ จะได้ output สลับกันไป
1
2
2
1
2
2
ซึ่งเรียกว่า RACE CONDITION คือ ความถูกต้องของการคำนวณ ขึ้นอยู่กับดวง...

***
แต่ถ้าเป็นกรณีนี้ (ไม่ว่าจะสั่ง print หรือ thread.yield();=ยอมให้คนอื่นทำงานก่อน )

output จะเป็น
1
1
จริงๆแล้ว เหมือนกับว่า ตรง คำสั่ง if มันต้องเสียเวลาเปรียบเทียบค่าอยู่แล้ว เลยโอนการทำงานไปให้อีก thread นึงก่อน
ซึ่ง tmp-t0  กับ tmp-t1 ก็เลยมีค่าเป็น 0 ทั้งคู่ 
พอเข้าบรรทัด x=tmp+1  ค่า x ตอนท้ายก็เลยเป็น 1 ทั้งคู่

***
มาดู race condition ของโค๊ดนี้อีกรอบ
มี x=0 เป็น ตัวแปรร่วม
t0 t1
int tmp=x; จะได้ tmpเป็น0
x=tmp+1; จะได้ xเป็น1
จบ
จบ
รอ
รอ
int tmp=x; จะได้ tmpเป็น1
x=tmp+1; จะได้ xเป็น2
int tmp=x; จะได้ tmpเป็น0
รอ
รอ
x=tmp+1; จะได้ xเป็น1
รอ
int tmp=x; จะได้ tmpเป็น0
x=tmp+1; จะได้ xเป็น1
จบ
int tmp=x; จะได้ tmpเป็น0
รอ
x=tmp+1; จะได้ xเป็น1
จบ
รอ
int tmp=x; จะได้ tmpเป็น0
รอ
x=tmp+1; จะได้ xเป็น1
ประมาณนี้รึป่าวนะ  แต่ที่ผลลัพธ์มี 21 น่าจะเกิดจาก คำสั่ง print(x) อีกที ที่จะถูกเรียกให้รันตอนไหนก็ไม่รู้

***
atomic คือ บรรทัดคำสั่งบรรทัดนึง ซึ่งจะมีค่คำสั่งเดียว แบ่งแยกไม่ได้
control pointer คือ ตัวชี้ เลขชี้บรรทัด ว่าตอนนี้ ทำงานอยู่บรรทัดไหน
interleaving แปลว่า การสอดแทรก คือการที่แต่ละโปรเซสสลับการทำงานได้? แทรกคั่นกลางกันได้?
ไม่ต้องรอให้ฝ่ายใดฝ่ายนึงทำงานจนเสร็จก่อน

***


***
State คือ เซ็ต/กรุ๊ป ของ (เลขcontrol pointer,ค่าของตัวแปร(หลายค่าก็ได้))
**ค่าตัวแปร ตอนเข้า state (คือตัวแปรที่ได้มาจากoperationของstateก่อนหน้า)ไม่ใช่ตอนจบ state
Transition คือ คู่ลำดับ ของ (State ปัจจุบัน, State ถัดไป)

cp=1 , tmp=ยังไม่init -> tmp=0
cp=2 , tmp=x;        -> tmp=0
cp=end, x=tmp+1;   -> x=1