Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาหน่วยความจำที่ขัดแย้งกันระหว่างหลายเธรดใน C++


สมมติว่าเรามี RAM และ RAM นั้นจัดเป็นบล็อค มีหลายกระบวนการที่ทำงานอยู่บนระบบ เราต้องจำไว้ว่าทุกกระบวนการได้รับข้อมูลต่อไปนี้ (เธรด T, Memory Block M, เวลา t, R/W) สิ่งนี้บ่งชี้ว่าเธรด T กำลังใช้งานบล็อกหน่วยความจำ M ในเวลาที่กำหนด t และการดำเนินการสามารถอ่านได้ (R ) หรือเขียน (W)

กรณีต่อไปนี้แสดงว่าหน่วยความจำขัดแย้งกันหรือไม่ -

  • การอ่านมากกว่าหนึ่งรายการในสถานที่เดียวกันไม่ใช่สาเหตุของความขัดแย้ง

  • เมื่อดำเนินการเขียนระหว่าง x+5 ถึง x-5 ไปยังตำแหน่งของ M จะมีหน้าที่สร้างข้อขัดแย้งสำหรับเธรดที่เข้าถึงตำแหน่ง M ในเวลา x โดยที่ x ถูกเรียกว่าเป็นบางครั้ง

ดังนั้น หากเธรด T1 เข้าถึงตำแหน่งหน่วยความจำ M ณ เวลา x+1 และเธรด T2 เข้าถึงตำแหน่ง M ก่อนเวลา x+6 ดังนั้น T1 และ T2 จะขัดแย้งกันเมื่อหนึ่งในนั้นดำเนินการเขียน

หากเรามีรายการเธรดที่เข้าถึงตำแหน่งหน่วยความจำ เราต้องหาข้อขัดแย้งให้เจอ

ดังนั้น หากอินพุตเป็นแบบ [(1, 932, 1, R), (2, 512, 2, W), (3, 932, 3, R), (4, 512, 4, R), (5 , 432, 5, R), (6, 512, 6, R),(7, 835, 7, W), (8, 432, 8, R)] จากนั้นผลลัพธ์จะเป็น Conflicting thread (2, 4 ) และ (2, 6) และการดำเนินการอื่นๆ ทั้งหมดจะเหมือนกัน

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • สร้างเธรดด้วย id, memory_block, เวลาและการดำเนินการ

  • จัดเรียงอาร์เรย์ th_arr ตามบล็อกหน่วยความจำ เมื่อหน่วยความจำบล็อกเหมือนกันจึงใช้เวลา

  • สำหรับการเริ่มต้น i :=1 เมื่อฉัน − n อัปเดต (เพิ่ม i ขึ้น 1) ทำ −

    • ถ้า th_arr[i].memory_block เหมือนกับ th_arr[i - 1].memory_block แล้ว −

      • ถ้า th_arr[i].time <=th_arr[i-1].time+5 แล้ว −

        • เจ :=ผม - 1

        • ในขณะที่ (th_arr[i].memory_block เหมือนกับ th_arr[j].memory_block และ th_arr[i].time <=th_arr[j].time+5 and j>=0) ทำ -

          • ถ้า th_arr[i].operation เหมือนกับ 'W' หรือ th_arr[j].operation เหมือนกับ 'W' ดังนั้น −

            • แสดงเธรดที่ขัดแย้งกัน th_arr[j] และ th_arr[i]

          • (ลด j โดย 1)

ตัวอย่าง (C++)

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

#includeใช้เนมสเปซ std;class Thread { สาธารณะ:int id, memory_block, เวลา; การดำเนินการถ่าน;};เปรียบเทียบบูล (const Thread&x, const Thread&y) { ถ้า (x.memory_block ==y.memory_block) ส่งคืน x.time =0) { if (th_arr[i].operation =='W' || th_arr[j].operation =='W') { cout <<"หัวข้อที่ขัดแย้งกัน [" < 

อินพุต

<ก่อนหน้า>{{1, 932, 1, 'R'}, {2, 512, 2, 'W'},{3, 932, 3, 'R'}, {4, 512, 4,'R' },{5, 432, 5, 'R'}, {6, 512, 6, 'R'},{7, 835, 7, 'W'}, {8, 432, 8,'R'}}

ผลลัพธ์

เธรดที่ขัดแย้ง [2, 4]เธรดที่ขัดแย้ง [2, 6]