คำอธิบายของเงื่อนไขการแข่งขันและความชะงักงัน

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

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

สรุป

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

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

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

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

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

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

วิธีอาจทำให้คำสั่งหนึ่งบรรทัดเกิดสภาวะการแย่งชิงหรือไม่ ตัวอย่างต่อไปนี้เพื่อดูวิธีที่ทำให้เกิดสภาวะการแย่งชิงตรวจสอบ มีสองเธรด และทั้งสองจะปรับปรุงตัวแปรที่ใช้ร่วมกันที่เรียกว่าผลรวม(ซึ่งจะแสดงเป็นds ใช้ ptr dword: [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 สามารถเริ่มต้นของการดำเนินการแล้ว ถ้าเหตุการณ์นี้เกิดขึ้น เกิดปัญหา การดำเนินการของเธรดไม่ถูก ดังนั้น คุณไม่สามารถควบคุมเวลาหรือลำดับของการดำเนินการ นอกจากนี้ ให้สังเกตว่า เธรดอาจดำเนินแตกต่างออกไปในขณะใช้งานจริงเทียบกับโหมดดีบัก นอกจากนี้ คุณสามารถดูว่า ถ้าคุณดำเนินการแต่ละเธรดในชุด ข้อผิดพลาดที่ไม่เกิดขึ้น สุ่มนี้ทำให้ข้อผิดพลาดเหล่านี้ยากขึ้นมากในการติดตาม และการตรวจแก้จุดบกพร่อง

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

อาการ

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

การชะงักงัน

การล็อกตายเกิดขึ้นเมื่อเธรดที่สองแต่ละล็อกตัวแปรแตกต่างกันในเวลาเดียวกัน และพยายามล็อกตัวแปรที่เธรดล็อกไว้แล้ว ผลที่ได้ แต่ละเธรดหยุดดำเนินการ และรอเธรดการนำออกใช้ตัวแปร เนื่องจากแต่ละเธรดพักอยู่ตัวแปรที่เธรดอื่นต้อง ไม่มีอะไรเกิดขึ้น และเธรดยังคง 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
				
การล็อกตาย 1 เธรดที่ได้รับอนุญาตให้ล็อก LeftVal เกิดขึ้น ตัวประมวลผลเธรด 1 ของการดำเนินการหยุด และเริ่มต้นการดำเนินการของเธรด 2 เธรดล็อก 2 RightVal และพยายามล็อก LeftVal เนื่องจากถูกล็อก LeftVal, 2 เธรดหยุด และรอ LeftVal ที่ถูกนำออกใช้ เพราะถูกหยุดเธรด 2 หัวข้อ 1 จะได้รับอนุญาตเพื่อดำเนินการต่อไป เธรด 1 พยายามล็อก RightVal แต่ไม่ สามารถ เนื่องจากเธรด 2 ได้ล็อกไว้ ผลที่ได้ เธรด 1 เริ่มทำงานให้รอจนกว่า RightVal กลายเป็นพร้อมใช้งาน แต่ละเธรดที่รอเธรดอื่น เนื่องจากแต่ละกลุ่มหัวข้อตัวแปรที่รอเธรดการล็อค และเธรดไม่ถูกปลดล็อกตัวแปรที่พักอยู่

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

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

อาการ

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

เธรดคืออะไร

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

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

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

คุณสมบัติ

หมายเลขบทความ (Article ID): 317723 - รีวิวครั้งสุดท้าย: 29 ตุลาคม 2556 - Revision: 5.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

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

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com