คำอธิบายของเงื่อนไขแข่งและ deadlocks

หมายเลขบทความ (Article ID): 317723 - ผลิตภัณฑ์ที่เกี่ยวข้องในบทความนี้
ขยายทั้งหมด | ยุบทั้งหมด

เนื้อหาบนหน้านี้

สรุป

visual Basic .NET หรือ Visual Basic 2005 มีความสามารถในการใช้เธรดในโปรแกรมประยุกต์ Visual Basic สำหรับในครั้งแรก เธรดที่แนะนำเกี่ยวกับการตรวจแก้จุดบกพร่องเช่นเงื่อนไขการแข่งและ deadlocks บทความนี้สำรวจปัญหาสองเหล่านี้

ข้อมูลเพิ่มเติม

เงื่อนไขการแข่ง

aแย่งเกิดขึ้นเมื่อเธรดที่สองเข้าถึงตัวแปรที่ใช้ร่วมกันในเวลาเดียวกัน เธรดแรกตัวแปรที่อ่าน และเธรดที่สองอ่านค่าเดียวกันจากตัวแปร แล้ว ทำเธรดแรกและเธรดที่สองของการดำเนินการกับมูลค่า และพวกเขา race เพื่อดูเธรดที่สามารถเขียนค่าล่าสุดให้กับตัวแปรที่ใช้ร่วมกัน ค่าของเธรดที่ค่าของเขียนล่าสุดถูกรักษาไว้ เนื่องจากเธรดกำลังเขียนเหนือค่าว่า เขียนกลุ่มหัวข้อก่อนหน้านี้

รายละเอียดและตัวอย่าง

มีการปันส่วนแต่ละกลุ่มหัวข้อที่มีรอบระยะเวลาที่กำหนดไว้ล่วงหน้าของเวลาในการดำเนินการตัวประมวลผล เมื่อเวลาที่ปันส่วนสำหรับเธรดที่หมดอายุ บริบทของเธรดถูกบันทึกจนกว่าจะเปิดการถัดไปบนตัวประมวลผล และตัวประมวลผลเริ่มต้นใช้งานการดำเนินการของเธรดถัดไป

ความสามารถทำคำสั่งบรรทัดหนึ่งให้แย่งหรือไม่ ตรวจสอบอย่างต่อไปนี้เพื่อดูวิธีแย่งเกิดขึ้น ไม่มีเธรดที่สอง และทั้งสองจะปรับปรุงตัวแปรที่ใช้ร่วมกันที่เรียกว่ายอดรวม(ซึ่งจะแสดงเป็นdword ptr ds: [031B49DCh]ในแอสเซมบลีรหัส)

โค้ด visual Basic:
   'Thread 1
   Total = Total + val1
				
   'Thread 2
   Total = Total - val2
				
แอสเซมบลีรหัส (ที่ มีหมายเลขบรรทัด) จากการคอมไพล์โค้ด Visual Basic ก่อนหน้านี้:
 'Thread 1
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   add         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        7611097F 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
 'Thread 2
 1.   mov         eax,dword ptr ds:[031B49DCh] 
 2.   sub         eax,edi 
 3.   jno         00000033 
 4.   xor         ecx,ecx 
 5.   call        76110BE7 
 6.   mov         dword ptr ds:[031B49DCh],eax 
				
ด้วยการดูรหัสของแอสเซมบลี คุณสามารถดูการดำเนินการที่จำนวนตัวประมวลผลที่กำลังทำที่ระดับต่ำกว่าในการดำเนินการคำนวณอย่างง่ายเพิ่มได้ เธรดอาจดำเนินการทั้งหมดหรือบางส่วนที่มีรหัสของแอสเซมบลีในระหว่างการหมดเวลาของตัวประมวลผล ขณะนี้ ดูวิธีการแย่งชิงเกิดขึ้นจากรหัสนี้

ผลรวมเป็น 100, val1 คือ 50 และ val2 15 เธรด 1 ได้รับโอกาสในการดำเนินการ แต่ขั้นตอนที่ 1 ถึง 3 ที่เสร็จสมบูรณ์แล้วเท่านั้น ซึ่งหมายความ ว่า เธรด 1 อ่านตัวแปร และเพิ่มการให้เสร็จสมบูรณ์ เพียงแค่ในขณะนี้เป็นการรอเธรด 1 การเขียนออกเป็นค่าใหม่ของ 150 หลังจากที่หยุดเธรด 1, 2 ของเธรดได้รับการดำเนินการเสร็จสมบูรณ์ ซึ่งหมายความ ว่า คุณได้เขียนค่าที่ จะคำนวณ (85) ออกไปทั้งหมดที่ตัวแปร และสุดท้าย เธรด 1 regains ควบคุม และทำการดำเนินงานเสร็จสมบูรณ์ เขียนออกมูลค่า (150) ดังนั้น เมื่อจบเธรด 1 ค่าของผลรวมได้ในขณะนี้ 150 แทนการ 85

คุณสามารถดูได้อย่างไรซึ่งอาจเป็นปัญหาที่สำคัญได้ หากนี้โปรแกรมธนาคาร ลูกค้าจะมีเงินในบัญชีของพวกเขาไม่ควรมีอยู่

ข้อผิดพลาดนี้เป็นแบบสุ่ม เนื่องจากเป็นไปได้สำหรับเธรด 1 การดำเนินการของการดำเนินการก่อนหมดเวลา หมดอายุของตัวประมวลผล แล้ว เธรด 2 จะเริ่มต้นการดำเนินการ ถ้าเหตุการณ์เหล่านี้เกิดขึ้น ยังไม่เกิดปัญหา การดำเนินการเธรดคือ nondeterministic ดังนั้น คุณไม่สามารถควบคุมเวลาหรือลำดับของการดำเนินการ นอกจากนี้ โปรดสังเกตว่า เธรดที่อาจเรียกใช้ในการรันไทม์และโหมดการตรวจแก้จุดบกพร่องแตกต่างกัน นอกจากนี้ คุณสามารถดูว่า ถ้าคุณดำเนินการแต่ละกลุ่มหัวข้อในลำดับ ข้อผิดพลาดที่ไม่เกิดขึ้น randomness นี้ทำข้อผิดพลาดเหล่านี้ยากขึ้นมากในการติดตามลง และการตรวจแก้จุดบกพร่อง

เพื่อป้องกันไม่ให้เงื่อนไขแข่งเกิดขึ้น คุณสามารถล็อกตัวแปรที่ใช้ร่วมกัน ดังนั้นเธรดเพียงหนึ่งครั้งมีการเข้าถึงตัวแปรที่ใช้ร่วมกัน ทำ sparingly เพราะถ้าตัวแปรถูกล็อกในเธรด 1 และ 2 ของเธรดตัวแปรที่จำเป็นต้องยัง การดำเนินการของเธรด 2 ของหยุดในขณะที่ 2 ของเธรดที่รอสำหรับเธรด 1 การปลดปล่อยตัวแปร (สำหรับข้อมูลเพิ่มเติม โปรดดู "SyncLock" ในส่วน "อ้างอิง" ของบทความนี้)

อาการ

อาการทั่วสภาวะการแย่งคือ ค่า unpredictable ของตัวแปรที่ใช้ร่วมกันระหว่างหลายเธรด ซึ่งผลลัพธ์จากการ unpredictability ของใบสั่งเธรดเรียกใช้ บางชนะเธรดที่หนึ่ง และบางชนะเธรดอื่น ทำงานในบางครั้ง การดำเนินได้อย่างถูกต้อง นอกจากนี้ หากเธรดแต่ละดำเนินแยกต่างหาก ค่าตัวแปรปฏิบัติอย่างถูกต้อง

deadlocks

adeadlockเกิดขึ้นเมื่อเธรดที่สองแต่ละล็อกตัวแปรที่แตกต่างกันในเวลาเดียวกัน และพยายามล็อกตัวแปรที่เธรดอื่นล็อกไว้แล้ว ด้วยเหตุ เธรดแต่ละหยุดการดำเนินการ และรอสำหรับเธรดอื่นไปยังตัวแปรที่นำออกใช้ เนื่องจากเธรดแต่ละจะเก็บตัวแปรที่เธรดอื่นต้อง ไม่มีสิ่งใดเกิดขึ้น และเธรดยังคง deadlocked

รายละเอียดและตัวอย่าง

รหัสต่อไปนี้มีสองวัตถุ LeftVal และ RightVal:
'Thread 1
SyncLock LeftVal
 SyncLock RightVal
  'Perform operations on LeftVal and RightVal that require read and write.
 End SyncLock
End SyncLock
				
'Thread 2
SyncLock RightVal
 SyncLock LeftVal
  'Perform operations on RightVal and LeftVal that require read and write.
 End SyncLock
End SyncLock
				
deadlock เกิดขึ้นเมื่อเธรด 1 จะได้รับอนุญาตให้ล็อก LeftVal ตัวประมวลผลหยุดการปฏิบัติการของเธรด 1 ของ และการเริ่มต้นการดำเนินการของเธรด 2 เธรดล็อก 2 RightVal แล้ว tries ล็อก LeftVal เนื่องจากถูกล็อก LeftVal, 2 เธรดหยุด และรอสำหรับ LeftVal ออกใช้ เนื่องจากหยุดเธรด 2, 1 เธรดไม่ได้รับอนุญาตให้ทำการดำเนินการต่อไป เธรด 1 พยายามล็อก RightVal แต่ไม่ สามารถ เนื่องจากเธรด 2 ได้ล็อก ด้วยเหตุ เธรด 1 เริ่มการรอจนกว่า RightVal สามารถใช้งานได้ เธรดแต่ละรอสำหรับอื่น ๆ เธรด เนื่องจากเธรดแต่ละได้ล็อกตัวแปรที่กำลังรอเธรดอื่น และเธรดไม่ถูก unlocking ตัวแปรที่จะถูกเก็บไว้

deadlock ไม่เกิดขึ้นตลอดเวลา หากเธรด 1 ดำเนินการล็อกทั้งก่อนที่ตัวประมวลผลหยุด เธรด 1 สามารถดำเนินการของ และการปลดล็อกตัวแปรที่ใช้ร่วมกันแล้ว หลังจากที่ 1 ของเธรด unlocks ตัวแปร 2 เธรดสามารถดำเนินการดำเนินการ ตามที่คาดไว้

ดูข้อผิดพลาดนี้เหมือนเห็นได้ชัดเจนเมื่อ snippets เหล่านี้รหัสถูกวางเคียงข้าง แต่ในการฝึก รหัสอาจปรากฏขึ้นในโมดูลที่แยกต่างหากหรือขอบเขตของรหัสของคุณ นี้มีข้อผิดพลาดที่ยากมากในการติดตามลงเนื่องจาก จากรหัสเดียวกันนี้ การดำเนินการถูกต้องและการดำเนินการไม่ถูกต้องจะเกิดขึ้น

อาการ

อาการที่พบโดยทั่วไปของ deadlock คือ ว่า โปรแกรมหรือกลุ่มของเธรดที่หยุดการตอบสนอง นี่คือเรียกอีกอย่างว่าการแฮง. อย่างน้อยสองเธรดกำลังรอแต่ละตัวแปรที่ถูกล็อกเธรดอื่น เธรดไม่ดำเนิน เนื่องจากเธรดไม่จะปล่อยตัวแปรนั้นจนกว่าจะได้รับข้อความแสดงตัวแปรอื่น โปรแกรมทั้งหมดสามารถวางถ้าโปรแกรมกำลังรอในหนึ่งหรือทั้งเธรดเหล่านั้นเพื่อดำเนินการเสร็จสมบูรณ์

สิ่งที่เป็นเธรดหรือไม่

กระบวนการที่จะใช้ในการแยกโปรแกรมประยุกต์อื่นที่กำลังดำเนินการในเวลาที่ระบุไว้ในคอมพิวเตอร์เครื่องเดียว ระบบปฏิบัติไม่ดำเนินกระบวนการ แต่เธรดที่ดำเนินการ เธรดคือ หน่วยของการดำเนินการ ระบบปฏิบัติการจัดสรรเวลาที่ใช้โปรเซสเซอร์เธรดสำหรับการดำเนินงานของเธรด กระบวนการเดียวประกอบด้วยหลายเธรดของการดำเนินการ แต่ละเธรดที่ต้องการเก็บรักษาตัวจัดการของตนเองข้อยกเว้น การจัดกำหนดการระดับความสำคัญ และชุดของโครงสร้างที่ระบบปฏิบัติการใช้ในการบันทึกของเธรดบริบทหากเธรดไม่สามารถทำการดำเนินการในช่วงเวลาที่จะถูกกำหนดให้กับตัวประมวลผล บริบทถูกเก็บไว้จนกว่าจะว่า เธรดที่ได้รับเวลาการประมวลผลในครั้งถัดไป บริบทประกอบด้วยข้อมูลทั้งหมดที่เธรดต้องการดำเนินการดำเนินการต่อไปอย่างราบรื่น ข้อมูลนี้รวมถึงของเธรดการตั้งค่าของตัวประมวลผลการลงทะเบียนและกองสายภายในพื้นที่ที่อยู่ของกระบวนการโฮสต์

ข้อมูลอ้างอิง

สำหรับข้อมูลเพิ่มเติม ค้นหาวิธีใช้ Studio Visual หาคำสำคัญต่อไปนี้:
  • SyncLock. อนุญาตให้วัตถุถูกล็อก เธรดอื่นพยายามล็อกออบเจ็กต์ที่เหมือนกัน จะถูกบล็อคจนกว่าเธรดแรกออก ใช้ SyncLock อย่างระมัดระวัง เนื่องจากปัญหาที่อาจส่งผลจาก misuse ของ SyncLock ตัวอย่างเช่น คำสั่งนี้สามารถป้องกันไม่ให้เงื่อนไขแข่ง แต่ทำให้เกิด deadlocks
  • interLocked. อนุญาตให้เลือกชุดของการดำเนินงานของเธรดปลอดภัยในตัวแปรที่ตัวเลขพื้นฐาน
สำหรับข้อมูลเพิ่มเติม โปรดคลิกหมายเลขบทความต่อไปนี้ เพื่อดูบทความในฐานความรู้ของ Microsoft::
316422INFO: Roadmap for Threading in Visual Basic .NET
สำหรับข้อมูลเพิ่มเติม ให้ดู MSDN เว็บไซต์ต่อไปนี้:
Threads and Threading

คุณสมบัติ

หมายเลขบทความ (Article ID): 317723 - รีวิวครั้งสุดท้าย: 13 มกราคม 2554 - Revision: 4.0
ใช้กับ
  • Microsoft Visual Basic 2005
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • Microsoft Visual Basic .NET 2002 Standard Edition
Keywords: 
kbvs2005swept kbvs2005applies kbinfo kbmt KB317723 KbMtth
แปลโดยคอมพิวเตอร์
ข้อมูลสำคัญ: บทความนี้แปลโดยซอฟต์แวร์การแปลด้วยคอมพิวเตอร์ของ Microsoft แทนที่จะเป็นนักแปลที่เป็นบุคคล Microsoft มีบทความที่แปลโดยนักแปลและบทความที่แปลด้วยคอมพิวเตอร์ เพื่อให้คุณสามารถเข้าถึงบทความทั้งหมดในฐานความรู้ของเรา ในภาษาของคุณเอง อย่างไรก็ตาม บทความที่แปลด้วยคอมพิวเตอร์นั้นอาจมีข้อบกพร่อง โดยอาจมีข้อผิดพลาดในคำศัพท์ รูปแบบการใช้ภาษาและไวยากรณ์ เช่นเดียวกับกรณีที่ชาวต่างชาติพูดผิดเมื่อพูดภาษาของคุณ Microsoft ไม่มีส่วนรับผิดชอบต่อความคลาดเคลื่อน ความผิดพลาดหรือความเสียหายที่เกิดจากการแปลเนื้อหาผิดพลาด หรือการใช้บทแปลของลูกค้า และ Microsoft มีการปรับปรุงซอฟต์แวร์การแปลด้วยคอมพิวเตอร์อยู่เป็นประจำ
ต่อไปนี้เป็นฉบับภาษาอังกฤษของบทความนี้:317723

ให้ข้อเสนอแนะ