ผู้เสนอ FP อ้างว่าภาวะพร้อมกันนั้นง่ายเนื่องจากกระบวนทัศน์ของพวกเขาหลีกเลี่ยงสภาวะที่ไม่แน่นอน ฉันไม่เข้าใจ
ฉันอยากจะถามคำถามทั่วไปเกี่ยวกับคนที่เป็น neophyte ที่ใช้งานได้ แต่ขึ้นอยู่กับลูกตาของฉันในผลข้างเคียงในช่วงหลายปีที่ผ่านมาและต้องการที่จะบรรเทาพวกเขาด้วยเหตุผลทุกประเภทรวมถึงง่ายกว่า (ปลอดภัยกว่า) เกิดข้อผิดพลาดได้ง่ายขึ้น ") เมื่อฉันมองไปที่เพื่อนร่วมงานของฉันและสิ่งที่พวกเขากำลังทำอยู่หญ้าก็ดูเป็นสีเขียวและมีกลิ่นที่ดีกว่าอย่างน้อยในเรื่องนี้
อัลกอริธึมแบบอนุกรม
ที่กล่าวไว้เกี่ยวกับตัวอย่างที่เฉพาะเจาะจงของคุณหากปัญหาของคุณเป็นแบบอนุกรมในลักษณะและ B ไม่สามารถดำเนินการได้จนกว่า A จะเสร็จสิ้นโดยทั่วไปคุณจะไม่สามารถเรียกใช้ A และ B ในแบบขนานไม่ว่าจะเกิดอะไรขึ้น คุณต้องหาวิธีที่จะทำลายการพึ่งพาคำสั่งเช่นเดียวกับในคำตอบของคุณขึ้นอยู่กับการเคลื่อนที่แบบขนานโดยใช้สถานะเกมเก่าหรือใช้โครงสร้างข้อมูลที่อนุญาตให้ส่วนต่าง ๆ ของมันถูกดัดแปลงอย่างอิสระเพื่อกำจัดการพึ่งพาคำสั่งตามที่เสนอในคำตอบอื่น ๆ หรืออะไรทำนองนี้ แต่มีส่วนแบ่งของปัญหาการออกแบบแนวความคิดเช่นนี้ซึ่งคุณไม่สามารถทำได้ทุกอย่างแบบมัลติเธรดอย่างง่ายดายเพราะสิ่งต่าง ๆ ไม่เปลี่ยนรูป บางสิ่งเป็นไปตามลำดับจนกว่าคุณจะพบวิธีที่ชาญฉลาดในการทำลายการพึ่งพาคำสั่งหากเป็นไปได้
เห็นพ้องง่ายยิ่งขึ้น
ที่กล่าวว่ามีหลายกรณีที่เราล้มเหลวในการขนานโปรแกรมที่เกี่ยวข้องกับผลข้างเคียงในสถานที่ที่อาจปรับปรุงประสิทธิภาพได้อย่างมีนัยสำคัญเพียงเพราะความเป็นไปได้ที่อาจไม่ปลอดภัยต่อเธรด หนึ่งในกรณีที่การกำจัดของรัฐที่ไม่แน่นอน (หรือมากขึ้นโดยเฉพาะผลกระทบด้านภายนอก) จะช่วยให้มากที่สุดเท่าที่ผมเห็นมันก็คือว่ามันจะเปลี่ยน"อาจจะหรืออาจจะไม่ด้ายปลอดภัย"เข้า"แน่นอนด้ายปลอดภัย"
ในการทำให้คำสั่งนั้นเป็นรูปธรรมมากขึ้นพิจารณาว่าฉันให้คุณใช้งานฟังก์ชั่นการเรียงลำดับใน C ซึ่งยอมรับตัวเปรียบเทียบและใช้มันเพื่อเรียงลำดับขององค์ประกอบต่างๆ มันมีความหมายโดยทั่วไปค่อนข้างมาก แต่ฉันจะให้สมมติฐานง่าย ๆ ว่ามันจะใช้กับอินพุตของสเกลดังกล่าว (องค์ประกอบนับล้านหรือมากกว่า) ว่ามันจะเป็นประโยชน์อย่างไม่ต้องสงสัยในการใช้การทำงานแบบมัลติเธรด คุณสามารถมัลติฟังก์ชั่นการเรียงลำดับของคุณได้ไหม?
ปัญหาคือคุณไม่สามารถทำได้เพราะตัวเปรียบเทียบของคุณอาจเรียกฟังก์ชันการเรียงลำดับทำให้เกิดผลข้างเคียงเว้นแต่คุณจะรู้ว่ามีการนำไปใช้อย่างไร (หรืออย่างน้อยที่สุดก็เป็นเอกสาร) สำหรับทุกกรณีที่เป็นไปได้ซึ่งเป็นไปไม่ได้โดยไม่ทำให้ฟังก์ชั่นเสื่อม ผู้เปรียบเทียบสามารถทำบางสิ่งที่น่าขยะแขยงเช่นปรับเปลี่ยนตัวแปรโกลบอลภายในโดยไม่ใช้อะตอมมิก ผู้เปรียบเทียบ 99.9999% อาจไม่ทำเช่นนี้ แต่เรายังไม่สามารถทำฟังก์ชั่นทั่วไปแบบมัลติเธรดนี้ได้เพียงเพราะ 0.00001% ของกรณีที่อาจทำให้เกิดผลข้างเคียง ดังนั้นคุณอาจต้องเสนอทั้งฟังก์ชั่นการเรียงลำดับเธรดเดียวและมัลติเธรดและส่งผ่านความรับผิดชอบไปยังโปรแกรมเมอร์ที่ใช้มันเพื่อตัดสินใจว่าจะใช้อันไหนตามความปลอดภัยของเธรด และผู้คนยังคงใช้เวอร์ชั่นเธรดเดียวและพลาดโอกาสในการทำมัลติเธรดเพราะพวกเขาอาจไม่แน่ใจว่าตัวเปรียบเทียบนั้นเป็นเธรดที่ปลอดภัยหรือไม่
มีพลังสมองมากมายที่สามารถมีส่วนร่วมเพียงแค่หาเหตุผลเข้าข้างตนเองเกี่ยวกับความปลอดภัยของสิ่งต่าง ๆ โดยไม่ต้องโยนกุญแจไปทุกที่ซึ่งสามารถหายไปได้หากเรามีการรับประกันอย่างหนักว่าฟังก์ชั่นจะไม่ทำให้เกิดผลข้างเคียงในตอนนี้และอนาคต และมีความกลัว: ความกลัวในทางปฏิบัติเพราะใครก็ตามที่ต้องแก้ไขข้อบกพร่องของการแข่งขันหลายครั้งเกินไปอาจจะลังเลเกี่ยวกับการทำมัลติเธรดอะไรก็ตามที่พวกเขาไม่สามารถแน่ใจได้ 110% ว่าปลอดภัยต่อเธรดและจะยังคงเป็นเช่นนี้ แม้กระทั่งสิ่งที่หวาดระแวงที่สุด (ซึ่งฉันอาจเป็นเส้นเขตแดนอย่างน้อยที่สุด) ฟังก์ชั่นที่บริสุทธิ์ให้ความรู้สึกโล่งใจและความมั่นใจที่ว่าเราสามารถเรียกมันได้อย่างปลอดภัยในแบบคู่ขนาน
และนี่เป็นหนึ่งในกรณีหลักที่ฉันเห็นว่าเป็นประโยชน์อย่างมากหากคุณได้รับการรับประกันอย่างหนักว่าฟังก์ชั่นดังกล่าวปลอดภัยต่อเธรดซึ่งคุณได้รับจากภาษาที่ใช้งานได้จริง อีกอย่างคือภาษาที่ใช้งานได้มักจะส่งเสริมการสร้างฟังก์ชั่นที่ไม่มีผลข้างเคียงในตอนแรก ตัวอย่างเช่นพวกเขาอาจให้โครงสร้างข้อมูลถาวรที่มีเหตุผลค่อนข้างมีประสิทธิภาพในการป้อนโครงสร้างข้อมูลขนาดใหญ่แล้วส่งออกแบรนด์ใหม่ที่มีเพียงส่วนเล็ก ๆ ของมันเปลี่ยนจากเดิมโดยไม่ต้องสัมผัสต้นฉบับ ผู้ที่ทำงานโดยไม่มีโครงสร้างข้อมูลดังกล่าวอาจต้องการแก้ไขโดยตรงและลดความปลอดภัยของเธรดระหว่างทาง
ผลข้างเคียง
ที่กล่าวว่าฉันไม่เห็นด้วยกับส่วนหนึ่งด้วยความเคารพจากเพื่อนทำงานของฉัน (ที่ฉันคิดว่าเด็ดสุด ๆ ):
[... ] เพราะกระบวนทัศน์ของพวกเขาหลีกเลี่ยงรัฐที่ไม่แน่นอน
มันไม่จำเป็นที่จะทำให้การเกิดพร้อมกันนั้นไม่จำเป็นเลยในทางปฏิบัติเมื่อฉันเห็นมัน เป็นฟังก์ชั่นที่หลีกเลี่ยงการก่อให้เกิดผลข้างเคียง หากฟังก์ชันอินพุตให้เรียงลำดับคัดลอกแล้วแปลงสำเนาเพื่อเรียงลำดับเนื้อหาและส่งออกสำเนาก็ยังคงเป็น thread-safe เช่นเดียวกับที่ทำงานกับชนิดอาร์เรย์ที่ไม่เปลี่ยนรูปแม้ว่าคุณจะผ่านอินพุตเดียวกัน อาร์เรย์จากหลายเธรด ดังนั้นฉันคิดว่ายังคงมีสถานที่สำหรับประเภทที่ไม่แน่นอนในการสร้างรหัสที่เป็นมิตรกับการใช้งานพร้อมกันดังนั้นแม้ว่าจะมีประโยชน์เพิ่มเติมมากมายสำหรับประเภทที่ไม่เปลี่ยนรูปแบบรวมถึงโครงสร้างข้อมูลถาวรที่ฉันใช้ไม่มากสำหรับคุณสมบัติที่ไม่เปลี่ยนรูป ลดค่าใช้จ่ายในการคัดลอกทุกอย่างเพื่อสร้างฟังก์ชั่นที่ปราศจากผลข้างเคียง
และมักจะมีค่าใช้จ่ายในการทำให้ฟังก์ชั่นปลอดจากผลข้างเคียงในรูปแบบของการสับและการคัดลอกข้อมูลเพิ่มเติมบางอย่างอาจเป็นทางอ้อมในระดับพิเศษและอาจมี GC บางส่วนในโครงสร้างข้อมูลถาวร แต่ฉันมองเพื่อนคนหนึ่ง เครื่อง 32 แกนและฉันคิดว่าการแลกเปลี่ยนน่าจะคุ้มค่าถ้าเราสามารถทำสิ่งต่าง ๆ ได้มากขึ้นในแบบคู่ขนาน