รวม pthread-win32
fork ของ RedFox20 + Oktonion + WinBuild
PThread https://github.com/WinBuilds/pthread-win32 การเปลี่ยนแปลง:
นี่คือทางแยกของเวอร์ชัน 2.10.0.0 ของแพ็คเกจ pthreads-win32 ABI ของตะเกียบนี้แตกต่างจากของเดิม
การเปลี่ยนแปลงเสร็จสิ้น:
ประเภทของตัวนับการใช้ซ้ำใน ptw32_handle_t
ได้ถูกเปลี่ยนจาก int
เป็น size_t
เพื่ออำนวยความสะดวกให้กับเซิร์ฟเวอร์ที่ทำงานเป็นเวลานาน
ลบองค์ประกอบที่ไม่ได้ใช้ออกจาก pthread_once_t
ไลบรารีนี้ได้รับการทดสอบบ่อยครั้งกับโปรเจ็กต์ Visual Studio 2022 อื่นๆ ของเรา
โดยทั่วไปฉันใช้ (และเคยใช้) ไฟล์โปรเจ็กต์ MSVC20xx สำหรับงานของฉัน Makefiles มีการใช้งานไม่บ่อย นัก และอาจล้าสมัย
โปรดทราบว่าคอมมิตข้อความ d4b0ef6b: แม้ว่าโปรเจ็กต์ MSVC2022/2019 ได้รับการกำหนดค่าให้เหมาะกับการตั้งค่าภายใน ของฉัน มาตลอด แต่อาจไม่เหมาะกับคุณ
แน่นอนว่าคุณสามารถแก้ไขการตั้งค่าด้วยตนเองได้ตลอดเวลา แต่เมื่อคุณจำเป็นต้องทำสิ่งนี้กับไฟล์โปรเจ็กต์ vcxproj
จำนวนมาก การเขียนสคริปต์งาน อาจ เป็นทางออก ดู update-vcxproj.js
และ patch-vcxproj.js
สำหรับสคริปต์ตัวอย่างที่ทำสิ่งนี้ ฉันใช้สิ่งเหล่านั้นเพื่อให้แน่ใจว่าโปรเจ็กต์ C/C++ ของฉันทั้งหมดมีการตั้งค่าบิลด์เหมือนกันทุกประการ ดังนั้นฉันจึงไม่ได้รับความประหลาดใจรันไทม์ที่น่ารังเกียจใดๆ เพราะบางโปรเจ็กต์ตัดสินใจสร้างด้วยไลบรารี Debug/Release Static/DLL Run Time ที่แตกต่างกันเล็กน้อย ฯลฯ ฯลฯ: วิธีมากมายที่คุณจะได้รับ ?? โดยระบบบิลด์ของคุณในสภาพแวดล้อม Windows สนุก! -
(17-12-2564)
นี่เป็นรุ่นย่อยที่มีการแก้ไขด้านการดูแลระบบเป็นส่วนใหญ่
mkdir b && cd b && cmake -G "Visual Studio 16 2019" ..
: ตกลง ซึ่งหมายความว่ามีการแก้ไขจุดบกพร่องที่ซุ่มซ่อนหลายประการแล้ว และเราได้รวมวิธีแก้ปัญหาสำหรับ CMake crap (ฉันยังคงไม่ชอบเครื่องมือนั้น) เมื่อแหล่งที่มา C จะถูกคอมไพล์ตามเงื่อนไขเป็น C++ (ดูเพิ่มเติมที่ pthread-EH.cpp และ pthread-JMP.c: ไฟล์ต้นฉบับ wrapper ใหม่สองไฟล์) นี่เป็นรุ่นย่อยที่มีการแก้ไขด้านการดูแลระบบเป็นส่วนใหญ่
รุ่น MSVC และ MinGW64 ได้รับการทดสอบบนสถาปัตยกรรม SMP (Intel x64 Hex Core) โดยทำชุดการทดสอบที่ให้มา รวมถึงการทดสอบความเครียดและการทดสอบแบบตั้งโต๊ะ
อย่าลืมรันบิลด์ของคุณกับชุดทดสอบ หากคุณเห็นความล้มเหลว โปรดพิจารณาว่า toolchains ของคุณมีส่วนทำให้เกิดความล้มเหลวได้อย่างไร ดูไฟล์ README สำหรับคำอธิบายโดยละเอียดเพิ่มเติมของ toolchains และระบบทดสอบที่เราใช้เพื่อให้การทดสอบผ่านไปได้สำเร็จ
เราขอแนะนำ MinGW64 เหนือ MinGW สำหรับทั้งรุ่น GNU CC 64 และ 32 บิตเท่านั้น เนื่องจากการจัดการข้อยกเว้น MinGW DWARF2 ด้วยรุ่น C++ ทำให้เกิดปัญหากับการยกเลิกเธรด
MinGW64 ยังมีการใช้งาน pthreads ดั้งเดิมของตัวเอง ซึ่งคุณอาจต้องการใช้ หากคุณต้องการสร้างไลบรารี่ของเรา คุณจะต้องเลือกตัวเลือก Win32 Native Threads ณ เวลาติดตั้ง เราขอแนะนำให้เลือกวิธีการจัดการข้อยกเว้น SJLJ สำหรับรุ่น MinGW64-w32 ด้วย สำหรับ MinGW64-w64 บิวด์ วิธีการจัดการข้อยกเว้น SJLJ หรือ SEH ควรใช้งานได้
(2018-08-08)
โปรดทราบว่านี่เป็นรุ่นหลักใหม่ การเพิ่มเวอร์ชันหลักจะทำให้เกิดการเปลี่ยนแปลง ABI สองครั้งพร้อมกับการเปลี่ยนแปลงการตั้งชื่ออื่นๆ ที่จะต้องมีการคอมไพล์ใหม่ของการเชื่อมโยงแอปพลิเคชัน และอาจมีการเปลี่ยนแปลงข้อความบางส่วนในการอ้างอิงมาโครเวลาคอมไพล์ในการกำหนดค่าและไฟล์ต้นฉบับ เช่น PTW32_* เปลี่ยนเป็น PTW32_ , ptw32_ เป็น ptw32_* เป็นต้น .
ด้วยข้อตกลงของผู้มีส่วนร่วมที่เกี่ยวข้องที่สำคัญทั้งหมด pthreads-win32 / pthreads4w เวอร์ชัน 3 ยกเว้นสี่ไฟล์ ได้รับการเผยแพร่ภายใต้เงื่อนไขของ Apache License v2.0 APLv2 เข้ากันได้กับใบอนุญาต GPLv3 และ LGPLv3 ดังนั้นรหัสนี้อาจยังคงรวมอยู่ตามกฎหมายภายในโครงการ GPLv3 และ LGPLv3
ผู้มีส่วนร่วมที่เกี่ยวข้องที่สำคัญถูกกำหนดให้เป็นผู้ที่มีส่วนร่วมกับโค้ดต้นฉบับที่ใช้ความสามารถที่มีอยู่ในรุ่นต่อๆ ไป สิ่งนี้ไม่รวมผู้ร่วมให้ข้อมูลหลายรายที่ได้สนับสนุนโค้ดที่ล้าสมัย หรือได้จัดเตรียมแพตช์ที่แก้ไขข้อบกพร่อง จัดระเบียบโค้ดใหม่เพื่อความสวยงามหรือในทางปฏิบัติ หรือปรับปรุงกระบวนการสร้าง ความแตกต่างนี้มีความจำเป็นเพื่อที่จะก้าวไปข้างหน้าในโอกาสที่ผู้ร่วมให้ข้อมูลบางส่วนจะสามารถติดต่อได้ ผู้มีส่วนร่วมทั้งหมดแสดงอยู่ในไฟล์ CONTRIBUTORS
ไฟล์สี่ไฟล์ที่จะยังคงเป็น LGPL แต่เปลี่ยนเป็น v3 คือไฟล์ที่ใช้ในการกำหนดค่าการสร้างสภาพแวดล้อม GNU:
aclocal.m4
configure.ac
GNUmakefile.in
tests/GNUmakefile.in
ผู้ร่วมให้ข้อมูลที่ร้องขอการเปลี่ยนแปลงนี้หรือตกลงเมื่อปรึกษาแล้วคือ:
การเผยแพร่ pthreads-win32 / pthreads4w เวอร์ชัน 2 จะยังคงเป็น LGPL แต่เวอร์ชัน 2.11 และใหม่กว่าจะออกภายใต้ v3 ของใบอนุญาตนั้น ดังนั้นการเพิ่มเติมใด ๆ ในโค้ด pthreads4w เวอร์ชัน 3 ที่ถูกแบ็คพอร์ตเป็น v2 จะไม่ทำให้โค้ดนั้นเสียหาย
การเปลี่ยนแปลงบางอย่างตั้งแต่ 26-02-2554 เป็นต้นไปอาจเข้ากันไม่ได้กับระบบรุ่นก่อน Windows 2000
การแก้ไขข้อบกพร่องใหม่ในทุกรุ่นตั้งแต่ 2.8.0 ไม่ได้นำไปใช้กับซีรี่ส์ 1.xx
รุ่น MSVC, MinGW และ MinGW64 ได้รับการทดสอบบนสถาปัตยกรรม SMP (Intel x64 Hex Core) โดยทำตามชุดการทดสอบที่ให้มา รวมถึงการทดสอบความเครียดและการทดสอบแบบตั้งโต๊ะ
อย่าลืมรันบิลด์ของคุณกับชุดทดสอบ หากคุณเห็นความล้มเหลว โปรดพิจารณาว่า toolchains ของคุณมีส่วนทำให้เกิดความล้มเหลวได้อย่างไร ดูไฟล์ README สำหรับคำอธิบายโดยละเอียดเพิ่มเติมของ toolchains และระบบทดสอบที่เราใช้เพื่อให้การทดสอบผ่านไปได้สำเร็จ
เราขอแนะนำ MinGW64 เหนือ MinGW สำหรับทั้งรุ่น GNU CC 64 และ 32 บิตเท่านั้น เนื่องจากการจัดการข้อยกเว้น MinGW DWARF2 ด้วยรุ่น C++ ทำให้เกิดปัญหากับการยกเลิกเธรด
MinGW64 ยังมีการใช้งาน pthreads ดั้งเดิมของตัวเอง ซึ่งคุณอาจต้องการใช้ หากคุณต้องการสร้างไลบรารีของเรา คุณจะต้องเลือกตัวเลือก Win32 Native Threads ณ เวลาติดตั้ง เราขอแนะนำให้เลือกวิธีการจัดการข้อยกเว้น SJLJ สำหรับรุ่น MinGW64-w32 ด้วย สำหรับ MinGW64-w64 บิวด์ วิธีการจัดการข้อยกเว้น SJLJ หรือ SEH ควรใช้งานได้
นอกเหนือจากรายการต่อไปนี้ รุ่นนี้มีฟีเจอร์เทียบเท่ากับเวอร์ชัน 2.11.0
รุ่นนี้จะแนะนำการเปลี่ยนแปลงใน pthread_t และ pthread_once_t ที่จะส่งผลต่อแอปพลิเคชันที่เชื่อมโยงกับไลบรารี
pthread_t: ยังคงเป็นโครงสร้าง แต่ขยายตัวนับการใช้ซ้ำจาก 32 บิตเป็น 64 บิต บนเครื่อง 64 บิต ขนาดโดยรวมของอ็อบเจ็กต์จะไม่เพิ่มขึ้น เราเพียงแค่ใส่ช่องว่างภายใน 4 ไบต์เพื่อการใช้งานที่ดี เพื่อลดความเสี่ยงที่ตัวนับสามารถวนเวียนอยู่ในแอปพลิเคชันที่รันระยะยาวมากจากขนาดเล็กไปจนถึงศูนย์ได้อย่างมีประสิทธิภาพ ตัวนับการใช้ซ้ำแบบ 64 บิตจะขยายเวลาการทำงานแบบไร้ความเสี่ยงจากหลายเดือน (โดยสมมติอายุการใช้งานเธรดเฉลี่ย 1 มิลลิวินาที) ไปจนถึงศตวรรษ (สมมติว่าอายุการใช้งานเธรดเฉลี่ย 1ns)
pthread_once_t: ลบองค์ประกอบที่ล้าสมัยสองรายการออกและลดขนาด
(2018-08-08)
การแก้ไขข้อบกพร่องใหม่ในทุกรุ่นตั้งแต่ 2.8.0 ไม่ได้นำไปใช้กับซีรี่ส์ 1.xx
การเปลี่ยนแปลงบางอย่างตั้งแต่ 26-02-2554 เป็นต้นไปอาจเข้ากันไม่ได้กับระบบรุ่นก่อน Windows 2000
pthreads-win32 / pthreads4w เวอร์ชัน 2.11 และเวอร์ชัน 2.x ในอนาคตทั้งหมดจะได้รับการเผยแพร่ภายใต้ Lesser GNU Public License เวอร์ชัน 3 (LGPLv3)
เวอร์ชันหลักถัดไปของซอฟต์แวร์นี้ (เวอร์ชัน 3) จะวางจำหน่ายภายใต้ Apache License เวอร์ชัน 2.0 (ALv2) การเปิดตัว 2.11 ภายใต้ LGPLv3 จะทำให้การแก้ไขเวอร์ชัน 3 ของซอฟต์แวร์นี้สามารถกลับไปเป็นเวอร์ชัน 2 ต่อไปได้ นอกจากนี้ โปรเจ็กต์ GPL ใดๆ ที่ใช้ไลบรารีนี้ในปัจจุบันจะสามารถใช้โค้ดเวอร์ชัน 2 หรือ 3 ในโปรเจ็กต์ของตนต่อไปได้
สำหรับข้อมูลเพิ่มเติม โปรดดู: https://www.apache.org/licenses/GPL-compatibility.html
เพื่อให้สอดคล้องกับการเปลี่ยนแปลงนี้ จากจุดนี้เป็นต้นไป การปรับเปลี่ยนไลบรารีนี้จะได้รับการยอมรับเฉพาะกับเวอร์ชัน 3 ของซอฟต์แวร์นี้ภายใต้เงื่อนไขของ ALv2 จากนั้นพวกเขาจะย้อนกลับไปเป็นเวอร์ชัน 2 ตามความเหมาะสม
เราหวังว่าจะเปิดตัวเวอร์ชัน 3 พร้อมกับเปิดตัวเวอร์ชัน 2.11
เวอร์ชันนี้ได้รับการทดสอบบนสถาปัตยกรรม SMP (Intel x64 Hex Core) โดยทำตามชุดการทดสอบที่ให้มา รวมถึงการทดสอบความเครียดและการทดสอบแบบตั้งโต๊ะ
อย่าลืมรันบิลด์ของคุณกับชุดทดสอบ หากคุณเห็นความล้มเหลว โปรดพิจารณาว่า toolchains ของคุณมีส่วนทำให้เกิดความล้มเหลวได้อย่างไร ดูไฟล์ README สำหรับคำอธิบายโดยละเอียดเพิ่มเติมของ toolchains และระบบทดสอบที่เราใช้เพื่อให้การทดสอบผ่านไปได้สำเร็จ เราขอแนะนำ MinGW64 เหนือ MinGW32 สำหรับทั้ง GNU CC บิลด์ 64 และ 32 บิต MinGW64 ยังมีการใช้งาน pthreads อิสระของตัวเอง ซึ่งคุณอาจต้องการใช้
สำหรับ Microsoft toolchain builds: (1) การเชื่อมโยงแบบคงที่ต้องใช้ทั้งไลบรารีนี้และไลบรารีการเชื่อมโยงหรือแอปพลิเคชันใด ๆ ที่จะคอมไพล์ด้วย /MT อย่างสม่ำเสมอ
(2) ไลบรารีแบบสแตติกถูกเปลี่ยนชื่อเป็น libpthreadV*.lib เพื่อแยกความแตกต่างจาก DLL import libs pthreadV*.lib
(3) หากคุณใช้การเชื่อมโยงแบบผสม เช่น การเชื่อมโยงเวอร์ชันสแตติก /MT ของไลบรารี่กับแอปพลิเคชันที่เชื่อมโยงกับ /MD คุณอาจสามารถใช้ GetLastError() เพื่อสอบถามรหัสข้อผิดพลาดได้ เนื่องจากไลบรารีตั้งค่าทั้งสอง errno (ผ่าน _set_errno ()) และ SetLastError()
ลบความพยายามในการตั้งค่า PTW32_USES_SEPARATE_CRT ในส่วนหัวซึ่งอาจทำให้เกิดผลลัพธ์ที่ไม่คาดคิด ในบางสถานการณ์ ผู้ใช้อาจต้องการกำหนดอย่างชัดเจนในสภาพแวดล้อมของตนเพื่อเรียกใช้เอฟเฟกต์ ไม่ว่าจะเมื่อสร้างไลบรารีหรือแอปพลิเคชัน หรือทั้งสองอย่าง ดู README ไม่สามารถพกพาได้ -- รอสส์ จอห์นสัน
ห้องสมุดควรมีความน่าเชื่อถือมากขึ้นภายใต้สถานการณ์ที่มีการเชื่อมโยงแบบคงที่อย่างสมบูรณ์ หมายเหตุ: เราได้ลบโค้ด PIMAGE_TLS_CALLBACK และเปลี่ยนกลับไปใช้วิธีก่อนหน้าซึ่งดูน่าเชื่อถือมากกว่าในคอมไพเลอร์ทุกรุ่น
การแก้ไขต่างๆ ใน GNUmakefile แม้ว่าไฟล์นี้จะถูกลบออกแล้ว แต่เพื่อความสมบูรณ์ การเปลี่ยนแปลงจึงได้รับการบันทึกเป็นการคอมมิตไปยังที่เก็บ
MinGW64-w64 กำหนด pid_t เป็น __int64 sched.h ตอนนี้สะท้อนให้เห็นว่า
การทดสอบหลายอย่างได้รับการแก้ไขแล้วซึ่งพบว่าล้มเหลวในเครื่องที่มีภาระงานมาก การทดสอบอื่นๆ ที่ใช้กลไกหยาบที่คล้ายกันในการซิงโครไนซ์เธรด (นี่คือการทดสอบหน่วย) มีการปรับปรุงแบบเดียวกัน: semaphore5.c ตระหนักดีว่า sem_destroy สามารถส่งคืน EBUSY ได้อย่างถูกต้องตามกฎหมาย; mutex6*.c, mutex7*.c และ mutex8*.c ทั้งหมดแทนที่ Sleep() เดียวด้วยลูปการโพล
(2016-09-18)
การแก้ไขข้อบกพร่องใหม่ในทุกรุ่นตั้งแต่ 2.8.0 ไม่ได้นำไปใช้กับซีรี่ส์ 1.xx
การเปลี่ยนแปลงบางอย่างตั้งแต่ 26-02-2554 เป็นต้นไปอาจเข้ากันไม่ได้กับระบบรุ่นก่อน Windows 2000
เวอร์ชันนี้ได้รับการทดสอบบนสถาปัตยกรรม SMP (Intel x64 Hex Core) โดยทำตามชุดการทดสอบที่ให้มา รวมถึงการทดสอบความเครียดและการทดสอบแบบตั้งโต๊ะ
อย่าลืมรันบิลด์ของคุณกับชุดทดสอบ หากคุณเห็นความล้มเหลว โปรดพิจารณาว่า toolchains ของคุณมีส่วนทำให้เกิดความล้มเหลวได้อย่างไร ดูไฟล์ README สำหรับคำอธิบายโดยละเอียดเพิ่มเติมของ toolchains และระบบทดสอบที่เราใช้เพื่อให้การทดสอบผ่านไปได้สำเร็จ เราขอแนะนำ MinGW64 เหนือ MinGW32 สำหรับทั้ง GNU CC บิลด์ 64 และ 32 บิต MinGW64 ยังมีการใช้งาน pthreads อิสระของตัวเอง ซึ่งคุณอาจต้องการใช้
กิจวัตรใหม่: pthread_timedjoin_np() pthread_tryjoin_np()
sched_getaffinity() sched_setaffinity() pthread_getaffinity_np() pthread_setaffinity_np() pthread_attr_getaffinity_np() pthread_attr_setaffinity_np()
pthread_getname_np() pthread_setname_np() pthread_attr_getname_np() pthread_attr_setname_np()
pthread_win32_getabstime_np()
สภาพแวดล้อมคอมไพเลอร์ GNU (MinGW32 และ MinGW64) ขณะนี้มีตัวเลือกในการใช้ autoconf เพื่อกำหนดค่าบิลด์โดยอัตโนมัติ
บิลด์: มีการเพิ่มเป้าหมาย makefile ใหม่ และเป้าหมายที่มีอยู่ถูกแก้ไขหรือลบออก ตัวอย่างเช่น เป้าหมายในการสร้างและทดสอบการกำหนดค่าที่เป็นไปได้ทั้งหมดของทั้ง dll และ lib แบบคงที่
ขณะนี้บิลด์คอมไพเลอร์ GNU ใช้ความเข้ากันได้มาตรฐาน ISO C และ C++ 2011 อย่างชัดเจน หากคอมไพเลอร์ GNU ของคุณไม่รองรับสิ่งนี้ โปรดพิจารณาอัปเดต การกำหนดค่าอัตโนมัติสามารถทำได้ผ่านสคริปต์ 'กำหนดค่า' ต้องสร้างสคริปต์โดยใช้ autoconf - ดูไฟล์ README ขอขอบคุณ Keith Marshall จากโครงการ MinGW
การเชื่อมโยงแบบคงที่: ฟังก์ชันการทำงานแบบอัตโนมัติถูกย้ายไปยัง dll.c และขยายออกไปเพื่อให้บิลด์ที่ใช้ MSVC8 และใหม่กว่าไม่จำเป็นต้องใช้แอปในการเรียก pthread_win32_thread_detach_np() อีกต่อไป นั่นคือ ฟังก์ชัน DllMain ทั้งหมดเป็นอัตโนมัติสำหรับการเชื่อมโยงแบบคงที่สำหรับรุ่นเหล่านี้
เป้าหมายการเชื่อมโยงแบบคงที่ nmake บางส่วนถูกปิดใช้งาน: เนื่องจากปัญหาเกี่ยวกับพฤติกรรม TLS เป้าหมาย V*-small-static* nmake ใน Makefile จึงถูกปิดใช้งาน ปัญหานี้เกิดขึ้นโดย tests/semaphore3.c โดยที่การเรียก pthread_self() ภายในเธรดล้มเหลวในการส่งคืนหมายเลขอ้างอิงเธรด POSIX ที่ถูกต้อง แต่ส่งคืนหมายเลขอ้างอิงเธรด POSIX "โดยนัย" ใหม่แทน ตัวจัดการ pthread โดยนัยมีสถานะเธรดที่แยกออก ซึ่งทำให้เกิดการเรียก pthread_detach() ภายในเธรดเพื่อส่งคืน EINVAL ดูเหมือนว่าเป้าหมาย V*-static* จะไม่ได้รับผลกระทบ ข้อแตกต่างหลักคือส่วนหลังถูกสร้างขึ้นจากหน่วยการคอมไพล์เดียว
การเชื่อมโยงแบบคงที่ของไฟล์วัตถุขนาดเล็กใช้งานได้แล้ว (MinGW) จำเป็นต้องมีรหัสอัตโนมัติ แต่ไม่มีการอ้างอิงถึงรหัสนี้อย่างชัดเจนดังนั้นจึงได้รับการปรับปรุงให้เหมาะสม
sem_getvalue() สามารถส่งคืนค่า errno แทนที่จะตั้งค่า errno และส่งกลับ -1
ค่า Errno จะหายไปหากไลบรารีเชื่อมโยงแบบคงที่กับไลบรารีรันไทม์ ซึ่งหมายความว่าแอปพลิเคชันใช้อินสแตนซ์รันไทม์แยกต่างหาก กรณีนี้ยังคงเป็นเช่นนี้ ยกเว้นว่ามีการเพิ่มสวิตช์บิลด์ที่ช่วยให้สามารถรวมสถานะข้อผิดพลาดที่มีประสิทธิภาพมากขึ้นได้ เช่น อนุญาตให้เรียกรหัสส่งคืนผ่าน GetLastError()
ระบุสาเหตุของความล้มเหลวที่สำคัญเกี่ยวกับการยกเลิกและ pthread_exit() สำหรับการกำหนดค่าบิวด์ GCE (GNU C++) ที่มาจาก Mingw32 ไม่แน่ใจว่านี่เป็นเรื่องทั่วไปหรือเฉพาะเมื่อสร้างไลบรารีและแอป 32 บิตที่ทำงานบนระบบ 64 บิต ความล้มเหลวเหล่านี้ไม่ได้เกิดขึ้นกับ Mingw64 บิลด์ 32 บิต (GCC ที่สร้างด้วยการเปิดใช้งาน multilib) ที่ทำงานบนระบบ 64 บิต
จุดบกพร่อง pthread_key_delete() ที่นำมาใช้ในรีลีส 2.9.x ทำให้รูทีนนี้ล้มเหลวในลักษณะที่ชุดทดสอบตรวจไม่พบ มีการเพิ่มการทดสอบใหม่เพื่อยืนยันว่ารูทีนนี้ทำงานได้อย่างถูกต้อง โดยเฉพาะอย่างยิ่งเมื่อมีการลบคีย์ที่มีตัวทำลายก่อนที่เธรดจะออก
pthread_win32_process_attach_np() แก้ไขความล้มเหลว/ความปลอดภัยที่อาจเกิดขึ้นในการค้นหาและโหลด QUSEREX.DLL
ขณะนี้ _POSIX_THREAD_ATTR_STACKADDR ถูกตั้งค่าเท่ากับ -1 ใน pthread.h ด้วยเหตุนี้ pthread_attr_setstackaddr() จึงส่งคืน ENOSYS ก่อนหน้านี้ค่าจะถูกจัดเก็บและสามารถเรียกคืนได้ แต่ไม่ได้ใช้อย่างอื่น pthread_attr_getstackaddr() ส่งคืน ENOSYS ตามลำดับ
แก้ไขหน่วยความจำรั่วที่อาจเกิดขึ้นใน pthread_mutex_init() การรั่วไหลจะเกิดขึ้นก็ต่อเมื่อการเริ่มต้น mutex ล้มเหลว (ซึ่งเกิดขึ้นน้อยมากหากเคย)
แก้ไขการหมดเวลาต่ำกว่ามิลลิวินาที ซึ่งทำให้ห้องสมุดต้องรอไม่ว่าง
แก้ไขสภาพการแข่งขันและความผิดพลาดในการล็อค MCS รหัสการจัดการคิวของพนักงานเสิร์ฟใน ptw32_mcs_lock_acquire แข่งกับรหัสการจัดการคิวใน ptw32_mcs_lock_release และทำให้เกิดข้อผิดพลาดในการแบ่งเซ็กเมนต์
(27-05-2555)
การแก้ไขข้อบกพร่องใหม่ในรุ่นนี้ตั้งแต่ 2.8.0 ไม่ได้นำไปใช้กับซีรี่ส์ 1.xx
รุ่นนี้จะมาแทนที่รุ่น 2.9.0 ที่สั้นมาก และเพิ่มการเปลี่ยนแปลงที่ไม่ใช่โค้ดในนาทีสุดท้ายเพื่อฝังคุณสมบัติเชิงอธิบายที่ดีขึ้นใน dll เพื่อระบุสถาปัตยกรรมเป้าหมายและสร้างสภาพแวดล้อม
การเปลี่ยนแปลงบางอย่างหลังวันที่ 26-02-2554 ใน CVS อาจเข้ากันไม่ได้กับระบบรุ่นก่อน Windows 2000
ขณะนี้เราไม่สนับสนุนการใช้ไลบรารีเวอร์ชันอื่นที่ไม่ใช่เวอร์ชัน "C" นั่นคือเวอร์ชัน "C++" ไม่ผ่านการทดสอบบางอย่างและไม่มีฟังก์ชันเพิ่มเติมใดๆ
เวอร์ชันนี้ได้รับการทดสอบบนสถาปัตยกรรม SMP (Intel x64 Hex Core) โดยทำชุดการทดสอบ การทดสอบความเครียด และการทดสอบแบบตั้งโต๊ะที่ให้มาด้วย
ขณะนี้คุณสมบัติ DLL รวมสถาปัตยกรรมเป้าหมายอย่างถูกต้องแล้ว เช่น คลิกขวาที่ไฟล์ pthreadVC2.dll ใน explorer และเลือกแท็บรายละเอียดจะแสดงคอมไพเลอร์และสถาปัตยกรรมในช่องคำอธิบาย เช่น "MS C x64" หรือ "MS C x86"
ขณะนี้การพึ่งพาไลบรารี winsock อยู่ในดุลยพินิจของ #define RETAIN_WSALASTERROR
ใน config.h ไม่ได้กำหนดไว้ตามค่าเริ่มต้นเว้นแต่จะมีการกำหนด WINCE (เพราะฉัน (RJ) ไม่แน่ใจถึงการพึ่งพาที่นั่น)
(MSC และ GNU builds) ขณะนี้ไลบรารีที่เชื่อมโยงแบบคงที่จะเริ่มต้นและล้างข้อมูลโดยอัตโนมัติเมื่อโปรแกรมเริ่ม/ออก กล่าวคือ แอปพลิเคชันที่เชื่อมโยงแบบคงที่ไม่จำเป็นต้องเรียกรูทีน pthread_win32_process_attach_np() และ pthread_win32_process_detach_np() อย่างชัดเจน pthread_win32_thread_detach_np() รูทีนต่อเธรดยังถูกเรียกเมื่อออกจากโปรแกรมเพื่อล้างทรัพยากร POSIX ที่ได้รับจากเธรดเนทีฟหลักของ Windows ถ้าฉัน (RJ) เข้าใจกระบวนการอย่างถูกต้อง เธรดดั้งเดิมของ Windows อื่นๆ ที่เรียกใช้รูทีน POSIX API อาจจำเป็นต้องเรียกใช้รูทีนการแยกเธรดเมื่อออกจากเธรด หากแอปพลิเคชันขึ้นอยู่กับทรัพยากร POSIX ที่เรียกคืนหรือเรียกใช้ตัวทำลาย POSIX TSD (TLS) ดู README.NONPORTABLE สำหรับคำอธิบายของรูทีนเหล่านี้
mutexes ที่แข็งแกร่งถูกนำมาใช้ภายในขอบเขต PROCESS_PRIVATE โปรดทราบว่าฟังก์ชัน pthread_mutex_* อาจส่งคืนรหัสข้อผิดพลาดที่แตกต่างกันสำหรับ mutexes ที่ทนทานมากกว่าที่เป็นอย่างอื่นในการใช้งานปกติ เช่น pthread_mutex_unlock จำเป็นต้องตรวจสอบความเป็นเจ้าของสำหรับ mutex ทุกประเภทเมื่อ mutex นั้นแข็งแกร่ง ในขณะที่สิ่งนี้จะไม่เกิดขึ้นสำหรับ "ปกติ" ที่ไม่ใช่- ประเภท mutex ที่แข็งแกร่ง
pthread_getunique_np ถูกนำไปใช้เพื่อให้เข้ากันได้กับระดับแหล่งที่มากับการใช้งานอื่นๆ บางอย่าง รูทีนนี้ส่งคืนหมายเลขลำดับ 64 บิตที่เกี่ยวข้องกับเธรดโดยเฉพาะ แอปพลิเคชันสามารถใช้เพื่อสั่งซื้อหรือแฮชตัวจัดการเธรด POSIX ได้
การเปลี่ยนแปลงอีกมากมายสำหรับระบบ 64 บิต
การปรับเปลี่ยนและแก้ไขต่างๆ เพื่อสร้างและทดสอบ WinCE
แก้ไข pthread_cond_destroy() - ไม่ควรเป็นจุดยกเลิก แก้ไขปัญหาการสร้างเล็กน้อยอื่นๆ แล้ว
ลบเงื่อนไขการหยุดชะงักที่อาจเกิดขึ้นจาก pthread_cond_destroy()
การปรับเปลี่ยนต่าง ๆ เพื่อสร้างและทดสอบสำหรับ Win64
การแก้ไขต่างๆ สำหรับ DLL ตัวช่วยการยกเลิก QueueUserAPCEx async (นี่คือการดาวน์โหลดแยกต่างหาก) และการล้างโค้ด pthreads
ลบการอ้างอิงตัวชี้ NULL ที่อาจเกิดขึ้น
ลบข้อกำหนดที่แอปพลิเคชันจำกัดจำนวนเธรดที่เรียก pthread_barrier_wait ให้เหลือเพียงจำนวนสิ่งกีดขวาง ลดการโต้แย้งระหว่างbarrier_waitและbarrier_destroyด้วย การเปลี่ยนแปลงนี้จะทำให้บาเรียช้าลงเล็กน้อย แต่จะลดจำนวนเซมาฟอร์ที่ใช้ต่อบาเรียลงครึ่งหนึ่ง
แก้ไขจุดจับรั่วใน sched_ [gs] etscheduler
ลบแมโครความเข้ากันได้ของฟังก์ชัน POSIX re-entrant ทั้งหมดออกจาก pthread.h บางส่วนก็ไม่ถูกต้องตามความหมาย
เธรดไม่พยายามส่งข้อยกเว้นที่ไม่ถูกตรวจจับออกจากขอบเขตเธรดอีกต่อไป (รุ่น C ++ และ SEH เท่านั้น) ข้อยกเว้นที่ไม่ถูกตรวจจับในขณะนี้ทำให้เธรดออกพร้อมกับโค้ดส่งคืน PTHREAD_CANCELED
การแก้ไขการหล่อจำนวนมากโดยเฉพาะสำหรับ x64 การแก้ไขแบบ Interlocked และการทำงานซ้ำสำหรับ x64
ขณะนี้การพึ่งพาไลบรารี winsock อยู่ในดุลยพินิจของ #define RETAIN_WSALASTERROR
ใน config.h ไม่ได้กำหนดไว้ตามค่าเริ่มต้นเว้นแต่จะมีการกำหนด WINCE (เนื่องจาก RJ ไม่แน่ใจถึงการพึ่งพาที่นั่น)
mutexes POSIX แบบคงที่หลายตัวที่ใช้สำหรับการจัดการภายในถูกแทนที่ด้วยการล็อกตามคิว MCS เพื่อลดการใช้ทรัพยากร โดยเฉพาะการใช้วัตถุ Win32
เพื่อความปลอดภัย ตอนนี้จะต้องติดตั้ง QuserEx.dll หากใช้อยู่ในโฟลเดอร์ Windows System
แข็งแกร่ง[1-5].c - ลำดับการกลายพันธุ์ที่แข็งแกร่ง 1.c - หมายเลขลำดับที่ไม่ซ้ำกันต่อเธรด
การทดสอบ mutex*.c ทั้งหมดได้รับการแก้ไขตามความเหมาะสมเพื่อทดสอบ mutex ที่ทนทานภายใต้เงื่อนไขเดียวกัน เพิ่มการทดสอบเปรียบเทียบ mutex ที่มีประสิทธิภาพไปยัง benchtest*.c ตามความเหมาะสม
(22-12-2549)
การแก้ไขข้อบกพร่องใหม่ในรุ่นนี้ตั้งแต่ 2.7.0 ยังไม่ได้นำไปใช้กับซีรีส์เวอร์ชัน 1.xx คงถึงเวลาที่จะปล่อยเวอร์ชั่น 1 แล้ว
รุ่นนี้ยังไม่ได้ทดสอบกับสถาปัตยกรรม SMP การทดสอบทั้งหมดผ่านระบบยูนิโปรเซสเซอร์
Sem_destroy สามารถส่งคืน EBUSY ได้แม้ว่าจะไม่มีเธรดรออยู่ในเซมาฟอร์ก็ตาม การแข่งขันอื่นๆ รอบโครงสร้างเซมาฟอร์ที่ไม่ถูกต้อง (ภายใน) ได้ถูกลบออกเช่นกัน
semaphore5.c - ทดสอบการแก้ไขข้อบกพร่องที่อ้างถึงข้างต้น
(2548-06-04)
คุณลักษณะใหม่ทั้งหมดในรุ่นนี้ได้รับการ back-ported ในรุ่น 1.11.0 รวมถึงการรวม MCS locks ใน pthread_once อย่างไรก็ตาม เวอร์ชัน 1 และ 2 ยังคงเข้ากันไม่ได้ แม้ว่าขณะนี้จะเหมือนกันในด้านประสิทธิภาพและฟังก์ชันการทำงานก็ตาม
รีลีสนี้ได้รับการทดสอบ (ผ่านการทดสอบ) ทั้งบนระบบที่ใช้โปรเซสเซอร์ตัวเดียวและหลายตัวประมวลผล
Pthread_once ได้รับการปรับใช้ใหม่เพื่อลบการเพิ่มลำดับความสำคัญและความซับซ้อนอื่น ๆ เพื่อปรับปรุงความทนทาน Races for Win32 handle ที่ไม่ซ้ำกับการรีไซเคิลได้ถูกลบออกแล้ว รูปแบบทั่วไปของ pthread_once ขณะนี้เหมือนกับที่แนะนำไว้ก่อนหน้านี้โดย Alexander Terekhov แต่แทนที่จะเป็น 'ชื่อ mutex' ได้มีการนำการล็อกแบบคิวมาใช้ซึ่งมีคุณสมบัติที่จำเป็นในการเริ่มต้นและการทำลายตนเองแบบไดนามิก ล็อคนี้ยังมีประสิทธิภาพ ABI จะไม่ได้รับผลกระทบเท่าที่ขนาดของ pthread_once_t ไม่มีการเปลี่ยนแปลง และ PTHREAD_ONCE_INIT ไม่มีการเปลี่ยนแปลง อย่างไรก็ตาม แอปพลิเคชันที่แอบดูภายใน pthread_once_t ซึ่งควรจะทึบแสงจะใช้งานไม่ได้
(2548-05-19)
การแก้ไขข้อบกพร่องและคุณสมบัติใหม่ทั้งหมดในรุ่นนี้ได้รับการพอร์ตกลับในรุ่น 1.10.0 แล้ว
รีลีสนี้ได้รับการทดสอบ (ผ่านการทดสอบ) ทั้งบนระบบที่ใช้โปรเซสเซอร์ตัวเดียวและหลายตัวประมวลผล ขอขอบคุณ Tim Theisen จาก TomoTherapy ที่ทำการทดสอบ MP อย่างถี่ถ้วน และให้การสังเกตและข้อมูลที่สำคัญเมื่อตรวจพบข้อผิดพลาด
(2548-05-52)
ขณะนี้แพ็คเกจรวมชุดเอกสารอ้างอิงซึ่งประกอบด้วยหน้าคู่มือสไตล์ Unix ในรูปแบบ HTML ที่ได้รับการแก้ไขเพื่อให้สอดคล้องกับ pthreads-win32 ชุดยังสามารถอ่านออนไลน์ได้ที่: http://sources.redhat.com/pthreads-win32/manual/index.html
ขอขอบคุณ Tim Theisen อีกครั้งที่เรียกใช้ชุดทดสอบรุ่นก่อนเผยแพร่บนระบบ MP
การแก้ไขข้อบกพร่องและคุณสมบัติใหม่ทั้งหมดในรุ่นนี้ได้รับการพอร์ตกลับในรุ่น 1.9.0 แล้ว
การใช้งานที่แก้ไขเพิ่มเติมหลีกเลี่ยงความจำเป็นสำหรับ HANDLE ที่มีปัญหา และเรียกคืนหน่วยความจำทันทีที่คีย์ถูกลบหรือออกจากเธรด ขึ้นอยู่กับว่ากรณีใดจะเกิดขึ้นก่อน
ขอขอบคุณ Richard Hughes จาก Aculab ที่ช่วยระบุและค้นหาจุดรั่ว
ขณะนี้ตัวทำลายคีย์ TSD ได้รับการประมวลผลสูงสุด PTHREAD_DESTRUCTOR_ITERATIONS ครั้ง แทนที่จะเป็นเพียงครั้งเดียว PTHREAD_DESTRUCTOR_ITERATIONS ถูกกำหนดไว้ใน pthread.h มาระยะหนึ่งแล้ว แต่ไม่ได้ใช้
แก้ไขการแข่งขันทางบัญชีเซมาฟอร์ระหว่างการยกเลิก sem_post/sem_post_multiple และ sem_wait นี่เป็นปัญหาเดียวกันกับ sem_timedwait ที่ได้รับการแก้ไขในรุ่นล่าสุด
sem_init, sem_post และ sem_post_multiple ตรวจสอบว่าจำนวนสัญญาณไม่เกิน _POSIX_SEM_VALUE_MAX
แม้ว่า sigwait() จะไม่มีอะไรมากไปกว่า no-op แต่อย่างน้อยก็ควรเป็นจุดยกเลิกเพื่อให้สอดคล้องกับมาตรฐาน
stress1.c - ความพยายามที่จะเปิดเผยปัญหาในตัวแปรเงื่อนไขและลอจิกรอตามกำหนดเวลาของเซมาฟอร์ การทดสอบนี้ได้รับแรงบันดาลใจจากโค้ดทดสอบตัวอย่างของ Stephan Mueller ที่ใช้ในการระบุจุดบกพร่อง sem_timedwait จากรุ่นล่าสุด ไม่ได้เป็นส่วนหนึ่งของชุดการทดสอบปกติเนื่องจากอาจใช้เวลาสักครู่จึงจะทำงานได้ หากต้องการเรียกใช้: nmake clean VC-stress
tsd2.c - ทดสอบว่าตัวทำลายคีย์ถูกรันอีกครั้งหากค่าคีย์ tsd ไม่เป็น NULL หลังจากที่รูทีน destructor รันแล้ว ทดสอบด้วยว่า pthread_setspecial() และ pthread_getspecial() สามารถเรียกได้จาก destructors
(26-04-2548)
ขณะนี้ไม่มีแผนที่จะออกเวอร์ชัน 3.0.0 เพื่อแก้ไขปัญหาใน pthread_once() การใช้งาน pthread_once ที่เป็นไปได้อื่นๆ จะยังคงได้รับการตรวจสอบสำหรับการเปิดตัวในอนาคตที่เป็นไปได้ โดยพยายามลดความซับซ้อนของการนำไปใช้ในปัจจุบัน
การแก้ไขข้อบกพร่องและคุณสมบัติใหม่ทั้งหมดในรุ่นนี้ได้รับการพอร์ตกลับสำหรับรุ่น 1.8.0 แล้ว
แก้ไขการแข่งขัน pthread_once (ความล้มเหลวในระบบ MP) ขอขอบคุณ Tim Theisen ที่ทำการทดสอบก่อนเผยแพร่อย่างละเอียดถี่ถ้วนบนระบบ MP ของเขาโดยใช้คอมไพเลอร์หลากหลายประเภท: VC++ 6 VC++ 7.1 Intel C++ เวอร์ชัน 8.0 การทดสอบทั้งหมดผ่านการทดสอบ มีการปรับปรุงความเร็วเล็กน้อยบางประการด้วย
แก้ไขข้อผิดพลาดจำนวนเต็มเกินใน pthread_mutex_timedlock() - พลาดเมื่อ sem_timedwait() ได้รับการแก้ไขในรุ่น 2.2.0 รูทีนนี้ไม่ส่งคืน ENOTSUP อีกต่อไปเมื่อมีการกำหนด NEED_SEM - รองรับแล้ว (NEED_SEM จำเป็นสำหรับ WinCE เวอร์ชันก่อน 3.0 เท่านั้น)
แก้ไขข้อผิดพลาดการหมดเวลาใน sem_timedwait()
แก้ไขปัญหาหลายประการในโค้ดที่รวมตามเงื่อนไข NEED_SEM รหัสที่รวม NEED_SEM มีไว้สำหรับระบบที่ไม่ใช้เซมาฟอร์ W32 เช่น WinCE ก่อนหน้าเวอร์ชัน 3.0 การใช้งานทางเลือกอื่นของเซมาฟอร์ POSIX ถูกสร้างขึ้นโดยใช้เหตุการณ์ W32 สำหรับระบบเหล่านี้เมื่อมีการกำหนด NEED_SEM โค้ดนี้ได้รับการเขียนใหม่ทั้งหมดในรีลีสนี้เพื่อนำโค้ดเซมาฟอร์ POSIX เริ่มต้นส่วนใหญ่กลับมาใช้ใหม่ และโดยเฉพาะอย่างยิ่ง เพื่อใช้รูทีน sem_* ทั้งหมดที่รองรับโดย pthreads-win32 Tim Theisen ยังเรียกใช้ชุดทดสอบโดยใช้โค้ด NEED_SEM บนระบบ MP ของเขาด้วย ผ่านการทดสอบทั้งหมด
ขณะนี้ไลบรารีสร้างโดยไม่มีข้อผิดพลาดสำหรับคอมไพเลอร์ Borland Builder 5.5
pthread_once ซับซ้อนเกินไป - แต่ใช้งานได้เท่าที่การทดสอบสามารถระบุได้ ..
dll เวอร์ชัน Borland ไม่ผ่านการทดสอบบางส่วนโดยมีข้อยกเว้นในการอ่านหน่วยความจำ ยังไม่ทราบสาเหตุ แต่ข้อบกพร่องของคอมไพเลอร์ยังไม่ได้รับการแก้ไข
(2548-04-55)
รุ่น 1.7.0 เป็น backport ของคุณสมบัติและการแก้ไขข้อบกพร่องใหม่ในรุ่นนี้ ดูหมายเหตุก่อนหน้าภายใต้รุ่น 2.0.0/ทั่วไป
(2548-04-04)
เพิ่มเป้าหมาย makefile เพื่อสร้างเวอร์ชันลิงก์คงที่ของไลบรารี ทั้ง MinGW และ MSVC โปรดทราบว่านี่ไม่ได้หมายความถึงการเปลี่ยนแปลงใด ๆ กับการอนุญาตสิทธิ์ LGPL ซึ่งยังคงกำหนดเงื่อนไขเฉพาะในการแจกจ่ายซอฟต์แวร์ที่เชื่อมโยงแบบคงที่กับไลบรารีนี้
มีข้อบกพร่องที่ทราบแล้วใน pthread_once() การยกเลิก init_routine ทำให้เกิดปัญหาความอดอยากที่อาจเกิดขึ้น (เช่น การหยุดชะงัก) หากเธรดที่รอมีลำดับความสำคัญสูงกว่าเธรดเริ่มต้น ปัญหานี้จะได้รับการแก้ไขในเวอร์ชัน 3.0.0 ของไลบรารี
แก้ไขข้อผิดพลาดจำนวนเต็มเกินใน sem_timedwait() เควิน ลัสซิเออร์
แก้ไขคำสั่งตัวประมวลผลล่วงหน้าสำหรับการเชื่อมโยงแบบคงที่ ดิมิทาร์ ปานาโยตอฟ
(2548-03-59)
(2548-03-59)
รุ่นนี้แสดงถึงการเปลี่ยนแปลง ABI และการตั้งชื่อเวอร์ชัน DLL ได้เพิ่มขึ้นจาก 1 เป็น 2 เช่น pthreadVC2.dll
เวอร์ชัน 1.4.0 back-ports ฟังก์ชันใหม่ที่รวมอยู่ในรุ่นนี้ โปรดแจกจ่าย DLL ที่สร้างจากเวอร์ชันนั้นพร้อมการอัปเดตไปยังแอปพลิเคชันที่สร้างบน pthreads-win32 เวอร์ชัน 1.xx
การตั้งชื่อแพ็คเกจมีการเปลี่ยนแปลง โดยแทนที่วันที่สแน็ปช็อตด้วยหมายเลขเวอร์ชัน + ข้อมูลรายละเอียด เช่น รีลีสนี้คือ "pthreads-win32-2-0-0-release"
เวอร์ชัน 1.3.0
เวอร์ชัน 1.2.0
เวอร์ชัน 1.1.0
เวอร์ชัน 1.0.0
สแน็ปช็อตนี้ส่วนใหญ่แก้ไขข้อผิดพลาด condvar ที่แนะนำใน snapshot-2004-11-03 การกำหนดเวอร์ชัน DLL ได้ถูกรวมไว้เพื่อให้แอปพลิเคชันตรวจสอบข้อมูลเวอร์ชัน DLL ที่เข้ากันได้ของ Microsoft และเพื่อขยายระบบการตั้งชื่อ DLL สำหรับ ABI และการเปลี่ยนแปลง API ที่สำคัญ ดูรายละเอียดไฟล์ readme
มีการเพิ่มทรัพยากรเวอร์ชันสไตล์ Microsoft ลงใน DLL สำหรับแอปพลิเคชันที่ต้องการตรวจสอบความเข้ากันได้ของ DLL เมื่อรันไทม์
การตั้งชื่อ PTHREADS-WIN32 DLL ได้รับการขยายเพื่อให้รุ่น DLL ที่เข้ากันไม่ได้สามารถอยู่ร่วมกันได้ในระบบไฟล์เดียวกัน ดูรายละเอียดไฟล์ README แต่สั้น ๆ : ในขณะที่ข้อมูลเวอร์ชันภายใน DLL จะเปลี่ยนไปตามแต่ละรุ่นจากนี้เป็นต้นไปชื่อเวอร์ชัน DLL จะเปลี่ยนไปเฉพาะในกรณีที่ DLL ใหม่ไม่เข้ากันได้กับแอปพลิเคชันรุ่นเก่า
รูปแบบการกำหนดเวอร์ชันได้รับการยืมมาจาก GNU libtool และรูปแบบการตั้งชื่อ DLL มาจาก Cygwin หากกฎการกำหนดหมายเลข Libtool ได้รับการยกย่องแผนการตั้งชื่อ Cygwin DLL โดยอัตโนมัติทำให้มั่นใจได้ว่าการเปลี่ยนแปลงชื่อ DLL นั้นน้อยที่สุดและแอปพลิเคชันจะไม่โหลด pthreads-Win32 DLL ที่เข้ากันไม่ได้
ผู้ที่ใช้ DLL ที่สร้างไว้ล่วงหน้าจะพบว่าชื่อ DLL/LIB มีคำต่อท้ายใหม่ (1) ในภาพรวมนี้ เช่น pthreadvc1.dll ฯลฯ
แมโคร posix บางตัวมีการเปลี่ยนแปลง
การเปลี่ยนแปลงเหล่านี้มีวัตถุประสงค์เพื่อให้สอดคล้องกับข้อมูลจำเพาะ UNIX เดียวเวอร์ชัน 3 ซึ่งระบุว่าหากตั้งค่าเป็น 0 (ศูนย์) หรือไม่ได้กำหนดแอปพลิเคชันอาจใช้ sysconf () เพื่อกำหนดค่าของพวกเขาที่รันไทม์ PTHREADS-WIN32 ไม่ได้ใช้ SYSCONF ()
มาโครต่อไปนี้จะไม่ได้กำหนดอีกต่อไป แต่กำหนดและตั้งค่าเป็น -1 (ไม่ได้ใช้งาน):
_POSIX_THREAD_ATTR_STACKADDR
_POSIX_THREAD_PRIO_INHERIT
_POSIX_THREAD_PRIO_PROTECT
_POSIX_THREAD_PROCESS_SHARED
มาโครต่อไปนี้ถูกกำหนดและตั้งค่าเป็น 200112L (นำไปใช้):
_POSIX_THREADS
_POSIX_THREAD_SAFE_FUNCTIONS
_POSIX_THREAD_ATTR_STACKSIZE
_POSIX_THREAD_PRIORITY_SCHEDULING
_POSIX_SEMAPHORES
_POSIX_READER_WRITER_LOCKS
_POSIX_SPIN_LOCKS
_POSIX_BARRIERS
มาโครต่อไปนี้ถูกกำหนดและตั้งค่าเป็นค่าที่เหมาะสม:
_POSIX_THREAD_THREADS_MAX
_POSIX_SEM_VALUE_MAX
_POSIX_SEM_NSEMS_MAX
PTHREAD_DESTRUCTOR_ITERATIONS
PTHREAD_KEYS_MAX
PTHREAD_STACK_MIN
PTHREAD_THREADS_MAX
DLL ที่ผลิตจากสแนปชอตนี้ไม่สามารถใช้กับแอปพลิเคชันรุ่นเก่าโดยไม่ต้องคอมไพล์แอปพลิเคชันใหม่เนื่องจากการเปลี่ยนแปลงเป็น pthread_t เพื่อให้ ID เธรด POSIX ที่ไม่ซ้ำกัน
แม้ว่าสแน็ปช็อตนี้จะผ่านชุดทดสอบขยาย แต่การเปลี่ยนแปลงจำนวนมากนั้นค่อนข้างสำคัญและแอปพลิเคชันบางอย่างอาจแสดงพฤติกรรมที่แตกต่างกันไปก่อนหน้านี้ดังนั้นนำมาใช้อย่างระมัดระวัง หวังว่าพฤติกรรมการเปลี่ยนแปลงใด ๆ จะเกิดจากห้องสมุดที่ดีขึ้นในงานไม่ได้แย่กว่านี้
PTHREAD_CREATE () ไม่ยอมรับ NULL เป็นข้อมูลอ้างอิงเธรดอีกต่อไป Segfault (ความผิดพลาดในการเข้าถึงหน่วยความจำ) จะส่งผลและจะไม่มีการสร้างเธรด
pthread_barrier_wait () ไม่ทำหน้าที่เป็นจุดยกเลิกอีกต่อไป
แก้ไขสภาพการแข่งขันที่มีศักยภาพใน pthread_once ()
เพิ่มสำหรับความเข้ากันได้: pthread_recursive_mutex_initializer, pthread_errorcheck_mutex_initializer, pthread_recursive_mutex_initializer_np, pthread_errorcheck_mutex_initializer_np
การสนับสนุนเบื้องต้นสำหรับคอมไพเลอร์ดิจิตอล Mars
mutexes เร็วขึ้น สิ่งเหล่านี้ได้รับการเขียนใหม่ตามแบบจำลองที่จัดทำโดย Alexander Terekhov ที่ลดการตรวจสอบพื้นที่เคอร์เนลและกำจัดส่วนสำคัญเพิ่มเติมบางส่วนที่ใช้ในการจัดการการแข่งขันระหว่างการหมดอายุของ TimedLock และปลดล็อค โปรดทราบว่า mutexes ใหม่ไม่ได้บังคับใช้การกำหนดเวลาอย่างเข้มงวดอย่างเข้มงวด FIFO ของ Mutexes อย่างไรก็ตามการล็อคที่ไม่ได้สั่งซื้อควรหายากมาก
เซมาฟอร์ที่เร็วกว่า ตามรูปแบบที่คล้ายกันกับ mutexes ด้านบนสิ่งเหล่านี้ได้รับการเขียนใหม่เพื่อใช้การตรวจสอบพื้นที่ผู้ใช้เบื้องต้น
ตอนนี้ sem_getValue () ส่งคืนจำนวนบริกร
ตอนนี้ ID เธรด Posix มีลักษณะเฉพาะที่แข็งแกร่งกว่ามาก Library Garrantees จะไม่นำ ID เธรดเดียวกันกลับมาใช้ใหม่อย่างน้อย 2^(คำพูด) วงจรการทำลาย/การสร้าง
Semaphore4.c: การทดสอบการยกเลิก SEM_WAIT ใหม่ ()
semaphore4t.c: เช่นเดียวกันสำหรับ sem_timedwait ()
rwlock8.c: การทดสอบและเวลาเส้นทางการดำเนินการช้าของล็อค R/W และ CVS, mutexes และ semaphores ที่พวกเขาสร้างขึ้น
พยายามเพิ่ม WATCOM ในรายการคอมไพเลอร์ที่สามารถสร้างห้องสมุด สิ่งนี้ล้มเหลวในตอนท้ายเนื่องจากเป็น Erno ที่ไม่ได้รับรู้ ห้องสมุดสร้าง แต่ชุดทดสอบล้มเหลว ดู readme.watcom สำหรับรายละเอียดเพิ่มเติม
หมายเหตุ: หากคุณไม่ได้ใช้การยกเลิก async ในแอปพลิเคชันของคุณหรือไม่จำเป็นต้องยกเลิกเธรดที่ถูกบล็อกบนทรัพยากรระบบเช่นเครือข่าย I/O ดังนั้นการยกเลิก async ที่ไม่ได้รับการยกเว้นจะเป็นค่าเริ่มต้นนั้นดีพอ อย่างไรก็ตาม pthreads-win32 ตรวจจับความพร้อมใช้งานของส่วนประกอบเหล่านี้ในเวลาทำงานดังนั้นคุณไม่จำเป็นต้องสร้างไลบรารีใหม่จากแหล่งที่มาหากคุณเปลี่ยนใจในภายหลัง
คำแนะนำทั้งหมดที่มีอยู่ในหนังสือและที่อื่น ๆ เกี่ยวกับความไม่พึงประสงค์ของการใช้การยกเลิก async ในแอปพลิเคชันใด ๆ ที่ยังคงอยู่ แต่คุณสมบัตินี้เป็นส่วนเสริมที่น่ายินดีเกี่ยวกับความสอดคล้องของห้องสมุดกับมาตรฐาน Posix
การทำความสะอาดการจัดการลำดับความสำคัญของเธรด โดยเฉพาะอย่างยิ่งการตั้งค่าลำดับความสำคัญเธรดตอนนี้พยายามที่จะแมปค่า Win32 ที่ไม่ถูกต้องภายในช่วงที่ส่งคืนโดย sched_get_priority_min/max () กับค่าที่มีประโยชน์ ดู readme.nonportable ภายใต้ "ลำดับความสำคัญของเธรด"
PTHREAD_GETSCHEDPARAM () ตอนนี้ส่งคืนลำดับความสำคัญที่ได้รับจากการโทรล่าสุดไปยัง PTHREAD_SETSCHEDPARAM () หรือจัดตั้งขึ้นโดย PTHREAD_CREATE () ตามมาตรฐานที่กำหนด ก่อนหน้านี้ pthread_getschedparam () ส่งคืนลำดับความสำคัญของเธรดที่เรียกใช้อย่างไม่ถูกต้อง ณ เวลาที่โทรซึ่งอาจได้รับการปรับหรือส่งเสริม/ลดระดับชั่วคราว
sched_get_priority_min () และ sched_get_priority_max () ตอนนี้ส่งคืน -1 บนข้อผิดพลาดและตั้งค่า errno ก่อนหน้านี้พวกเขาส่งคืนค่าข้อผิดพลาดอย่างไม่ถูกต้องโดยตรง
PTHREAD_SELF () จะปลดปล่อยด้ามเธรด POSIX โดยนัยที่สร้างขึ้นใหม่หาก DuplicateHandle ล้มเหลวแทนที่จะรีไซเคิล (ไม่น่าเป็นไปได้มาก)
PTHREAD_EXIT () ไม่ได้เป็นอิสระหรือรีไซเคิลโครงสร้างเธรด POSIX สำหรับเธรด POSIX โดยนัย
ตั้งแต่การใช้งานดั้งเดิมของ John Bossom ห้องสมุดได้อนุญาตให้มีเธรดที่ไม่ได้เริ่มต้นจาก Posix (เธรด Win32) เพื่อเรียกรูทีน Pthreads-WIN32 และโต้ตอบกับเธรด Posix สิ่งนี้ทำได้โดยการสร้าง ID เธรด posix แบบ on-the-fly สำหรับเธรด Win32 ที่เมื่อสร้างขึ้นเมื่ออนุญาตให้มีปฏิสัมพันธ์กับการแลกเปลี่ยนอย่างสมบูรณ์ สิ่งนี้ไม่ได้ขยายไปถึงการยกเลิกเธรด (async หรือรอการตัดบัญชี) ตอนนี้มัน
เธรดใด ๆ สามารถยกเลิกได้โดยเธรดอื่น ๆ (win32 หรือ posix) หากทราบค่า posix pthread_t ของเธรดเดิม มันคือ Destructors TSD และ Posix Cleanup Handlers จะถูกเรียกใช้ก่อนที่เธรดจะออกด้วยรหัสออกของ pthread_canceled (เรียกดูด้วย getExitCodethread ())
สิ่งนี้จะช่วยให้เธรด Win32 เป็นตัวอย่างเช่นการเรียกรูทีน Posix CV ในลักษณะเดียวกับที่เธรด posix จะ/ควรด้วย pthread_cond_wait () การยกเลิกและตัวจัดการการทำความสะอาด (pthread_cond_wait () เป็นจุดยกเลิก posix)
โดยการเพิ่มการยกเลิกเธรด Win32 ควรจะสามารถเรียกรูทีน Posix Threads ทั้งหมดที่สมเหตุสมผลรวมถึง semaphores, mutexes, ตัวแปรเงื่อนไข, การอ่าน/เขียนล็อค, อุปสรรค, spinlocks, TSD, การทำความสะอาด/ป๊อป, การยกเลิก, pthread_exit, กำหนดเวลา, ฯลฯ .
โปรดทราบว่ารหัสเธรด POSIX 'โดยปริยาย' แบบ on-the-fly เหล่านี้จะเริ่มต้นเป็นเดี่ยว (ไม่สามารถเข้าร่วมได้) กับประเภทการยกเลิกที่เลื่อนออกไป ID เธรด POSIX จะถูกสร้างขึ้นโดยอัตโนมัติโดยรูทีน POSIX ใด ๆ ที่ต้องการที่จับ POSIX (เว้นแต่ว่ารูทีนจะต้องใช้ pthread_t เป็นพารามิเตอร์ของหลักสูตร) เธรด win32 สามารถค้นพบ ID เธรด Posix ของตัวเองโดยเรียก pthread_self () ซึ่งจะสร้างที่จับหากจำเป็นและส่งคืนค่า pthread_t
ทดสอบคุณสมบัติใหม่ข้างต้น
สแน็ปช็อตนี้แก้ไขการทุจริตโดยบังเอิญไปยังแหล่งทดสอบกรณีใหม่ ไม่มีการเปลี่ยนแปลงซอร์สโค้ดไลบรารี
การเปลี่ยนแปลงต่าง ๆ เพื่อกระชับการตรวจสอบ ARG และทำงานกับ MingW32 และ MSYSDTK เวอร์ชันในภายหลัง
PTHREAD_GETSCHEDPARAM () ฯลฯ แก้ไขการตรวจสอบความถูกต้องของเธรดอันตราย
ตอนนี้ sem_timedwait () ใช้การตรวจสอบที่เข้มงวดมากขึ้นสำหรับค่า abstime ที่ไม่สมเหตุสมผล - ซึ่งจะส่งผลให้ค่าหมดเวลาที่ไม่คาดคิด
PTW32_COND_WAIT_CLEANUP () ไม่ได้ใช้สัญญาณ CV อย่างลึกลับอีกต่อไป แต่อาจทำให้เกิดการตื่นขึ้นมาปลอมมากขึ้น เป็นที่เชื่อกันว่าการโทร sem_timedwait () กำลังใช้สัญญาณ CV ว่าไม่ควร
แก้ไขการรั่วไหลของหน่วยความจำใน ptw32_threaddestroy () สำหรับเธรดโดยนัย
แก้ไขศักยภาพสำหรับการหยุดชะงักใน pthread_cond_destroy () การหยุดชะงักอาจเกิดขึ้นได้สำหรับ CVS ที่ประกาศแบบคงที่ (PTHREAD_COND_INITIALIZER) เมื่อเธรดหนึ่งพยายามที่จะทำลายตัวแปรเงื่อนไขในขณะที่อีกเธรดพยายามเริ่มต้นแบบไดนามิก
ก่อนหน้านี้หากไม่ได้กำหนดรูปแบบการทำความสะอาดจะถูกกำหนดโดยอัตโนมัติจากคอมไพเลอร์/ภาษาและหนึ่งในต่อไปนี้ถูกกำหนดตาม:
PTW32_CLEANUP_SEH MSVC only
PTW32_CLEANUP_CXX C++, including MSVC++, GNU G++
PTW32_CLEANUP_C C, including GNU GCC, not MSVC
สิ่งเหล่านี้กำหนดการกำหนดรูปแบบของการทำความสะอาด (ดู pthread.h) และที่สำคัญที่สุดคือวิธีการยกเลิกและการออกจากเธรด (ผ่าน pthread_exit) (ดูรูทีน PTW32_throw () ในส่วนตัว)
ในระยะสั้นข้อยกเว้นของไลบรารีจะทำการยกเว้นเมื่อเธรดถูกยกเลิกหรือออก (ผ่าน pthread_exit ()) ซึ่งถูกจับโดยตัวจัดการในรูทีนเริ่มต้นเธรด เธรดคือเมื่อถูกยกเลิกหรือออกผ่าน pthread_exit ()
ในสแน็ปช็อตนี้และในอนาคตเว้นแต่ว่าการสร้างจะกำหนดอย่างชัดเจน (เช่นผ่านตัวเลือกคอมไพเลอร์) PTW32_Cleanup_seh, PTW32_Cleanup_CXX หรือ PTW32_Cleanup_C จากนั้นบิลด์ตอนนี้จะเริ่มต้น รูปแบบนี้ใช้ setjmp/longjmp ในการยกเลิกการใช้งานและ pthread_exit ดังนั้นจึงจะไม่คลี่คลายสแต็กแม้ว่าจะเชื่อมโยงกับแอปพลิเคชันที่มี (เช่นแอพ C ++) นี่คือความสอดคล้องกับการใช้งานเธรด UNIX POSIX เชิงพาณิชย์ในปัจจุบันส่วนใหญ่ Tru64 ของ Compaq อาจเป็นข้อยกเว้น (ไม่มีการเล่นสำนวน) และแนวโน้มในอนาคตที่เป็นไปได้
แม้ว่ามันจะไม่ได้รับการบันทึกไว้อย่างชัดเจนมาก่อน แต่ก็ยังจำเป็นที่จะต้องสร้างแอปพลิเคชันของคุณโดยใช้ PTW32_Cleanup_* กำหนดตามที่ใช้สำหรับเวอร์ชันของไลบรารีที่คุณเชื่อมโยงด้วยเพื่อให้รวมส่วนที่ถูกต้องของ pthread.h นั่นคือการกำหนดที่เป็นไปได้ต้องใช้เวอร์ชันไลบรารีต่อไปนี้:
PTW32_CLEANUP_SEH pthreadVSE.dll
PTW32_CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll
PTW32_CLEANUP_C pthreadVC.dll or pthreadGC.dll
เช่นไม่ว่าแอปของคุณคือ C หรือ C ++ หากคุณเชื่อมโยงกับ pthreadvc.lib หรือ libpthreadgc.a คุณต้องกำหนด ptw32_cleanup_c
ประเด็นทั้งหมดนี้คือ: หากคุณยังไม่ได้กำหนดหนึ่งในสิ่งเหล่านี้อย่างชัดเจนแล้วค่าเริ่มต้นตามที่อธิบายไว้ที่ด้านบนของส่วนนี้ถูกนำมาใช้
ตอนนี้การเปลี่ยนแปลงนี้ได้รับการอธิบายไว้ข้างต้น แต่เพื่อพยายามทำให้ชัดเจนยิ่งขึ้นนี่คือตัวอย่าง:
หากคุณกำลังสร้างแอปพลิเคชันของคุณด้วย MSVC ++ IE โดยใช้ข้อยกเว้น C ++ และไม่ได้กำหนด PTW32_Cleanup_*อย่างใดอย่างหนึ่งอย่างชัดเจนดังนั้น PTW32_Cleanup_C ++ จะถูกกำหนดโดยอัตโนมัติใน pthread.h คุณควรเชื่อมโยงกับ pthreadvce.dll ซึ่งสแต็กคลี่คลาย
หากตอนนี้คุณสร้างแอปพลิเคชันของคุณอย่างที่คุณเคยมีมาก่อนหน้านี้ pthread.h จะตั้งค่า ptw32_cleanup_c โดยอัตโนมัติเป็นสไตล์เริ่มต้นและคุณจะต้องเชื่อมโยงกับ pthreadvc.dll ตอนนี้สแต็กคลี่คลายจะไม่เกิดขึ้นเมื่อเธรดถูกยกเลิกหรือการเรียกเธรด pthread_exit ()
ตอนนี้แอปพลิเคชันของคุณจะมีพฤติกรรมที่แตกต่างไปจากรุ่นก่อนหน้าและในรูปแบบที่ไม่ชัดเจน ส่วนใหญ่เป็นไปได้ว่าวัตถุอินสแตนซ์ในท้องถิ่นอาจไม่ถูกทำลายหรือทำความสะอาดหลังจากยกเลิกเธรด
หากคุณต้องการพฤติกรรมเดียวกันกับก่อนหน้านี้คุณต้องกำหนด PTW32_Cleanup_C ++ อย่างชัดเจนโดยใช้ตัวเลือกคอมไพเลอร์และลิงก์ด้วย pthreadvce.dll เหมือนที่คุณเคยทำมาก่อน
ทำไมเราถึงทำให้สไตล์เริ่มต้นมีข้อยกเว้นน้อยกว่า? เนื่องจากไม่มีการใช้งานเธรด UNIX POSIX ในเชิงพาณิชย์ช่วยให้คุณเลือกที่จะคลี่คลายสแต็ก ดังนั้นการให้มันใน pthread-win32 เป็นค่าเริ่มต้นจึงเป็นอันตราย เรายังคงให้ทางเลือก แต่ถ้าคุณเลือกที่จะทำอย่างอื่นอย่างมีสติแอปพลิเคชัน pthreads ของคุณจะเรียกใช้หรือขัดข้องในลักษณะที่คล้ายกันโดยไม่คำนึงถึงแพลตฟอร์มเธรดที่คุณใช้ หรืออย่างน้อยนี่คือความหวัง
ทำไมไม่ลบไลบรารีเวอร์ชันข้อยกเว้นทั้งหมด? มีเหตุผลสองสามข้อ:
เพื่อให้สามารถสร้างขนาดภาพที่เล็กลงสำหรับแอปพลิเคชันที่เชื่อมโยงแบบคงที่กับไลบรารีรูทีนส่วนใหญ่จะถูกแยกออกเป็นไฟล์ซอร์สโค้ดแต่ละไฟล์
สิ่งนี้กำลังดำเนินการในลักษณะที่เข้ากันได้ย้อนหลัง ไฟล์ต้นฉบับเก่าจะถูกนำมาใช้ซ้ำเพื่อรวมไฟล์รูทีนแต่ละไฟล์เป็นหน่วยการแปลขนาดใหญ่ (ผ่านกลุ่ม #includes) เพื่อให้คอมไพเลอร์ยังสามารถปรับให้เหมาะสมทุกที่ที่เป็นไปได้เช่นผ่านการ inlining ซึ่งสามารถทำได้ภายในหน่วยการแปลเดียวกัน
นอกจากนี้ยังเป็นไปได้ที่จะสร้างไลบรารีทั้งหมดโดยการรวบรวมไฟล์เดียวชื่อ "pthread.c" ซึ่งเพียงแค่ #รวมไฟล์แหล่งที่มารองทั้งหมด คอมไพเลอร์อาจสามารถใช้สิ่งนี้เพื่อทำกิจวัตรการอินไลน์ได้มากขึ้น
แม้ว่าคอมไพเลอร์ GNU จะสามารถสร้างไลบรารีที่มีการแยกที่จำเป็น (สวิตช์ -SGMENTS -FFUNCTION -SEGMENTS), AFAIK, MSVC และคอมไพเลอร์อื่น ๆ ไม่มีคุณสมบัตินี้
ในที่สุดเนื่องจากฉันใช้ MakeFiles และ Command-Line Compilation ฉันไม่รู้ว่าการปรับโครงสร้างองค์กรนี้อาจทำให้ผู้ใช้ไฟล์โครงการ IDE เป็นอย่างไร คุณควรจะสามารถใช้ไฟล์โครงการที่มีอยู่ได้โดยไม่ต้องแก้ไข
pthread_num_processors_np ():
ส่งคืนจำนวนโปรเซสเซอร์ในระบบที่มีให้กับกระบวนการตามที่กำหนดจากหน้ากาก Affinity โปรเซสเซอร์
pthread_timechange_handler_np ():
เพื่อปรับปรุงความทนทานต่อผู้ประกอบการหรือบริการเวลาเริ่มต้นการเปลี่ยนแปลงนาฬิการะบบ
รูทีนนี้สามารถเรียกได้โดยแอปพลิเคชันเมื่อได้รับข้อความ WM_TimeChange จากระบบ ในปัจจุบันมันออกอากาศตัวแปรเงื่อนไขทั้งหมดเพื่อให้เธรดรอสามารถตื่นขึ้นมาและประเมินเงื่อนไขของพวกเขาอีกครั้ง
เนื่องจาก Win95 ไม่ได้จัดเตรียมไว้ตอนนี้ห้องสมุดมีรูทีน InterlockedCompareexChange () ของตัวเองซึ่งใช้เมื่อใดก็ตามที่ Windows ไม่ได้จัดเตรียมไว้ InterlockedCompareexChange () ใช้ในการใช้สปินล็อคและอุปสรรคและใน mutexes รูทีนนี้ขึ้นอยู่กับคำสั่งเครื่อง CMPXCHG ซึ่งไม่สามารถใช้ได้ใน CPU I386 ห้องสมุดนี้ (จาก Snapshot 20010712 เป็นต้นไป) จึงไม่ได้รับการสนับสนุนบนแพลตฟอร์มโปรเซสเซอร์ I386 อีกต่อไป
สำหรับการพกพาซอร์สโค้ดเท่านั้น - RWLOCKS ยังไม่สามารถแชร์กระบวนการได้
pthread_rwlockattr_init()
pthread_rwlockattr_destroy()
pthread_rwlockattr_setpshared()
pthread_rwlockattr_getpshared()
ตามที่กำหนดไว้ในมาตรฐาน Posix ใหม่และ UNIX SPEC เวอร์ชัน 3:
sem_timedwait()
pthread_mutex_timedlock() - Alexander Terekhov and Thomas Pfaff
pthread_rwlock_timedrdlock() - adapted from pthread_rwlock_rdlock()
pthread_rwlock_timedwrlock() - adapted from pthread_rwlock_wrlock()
[ยังไม่ได้สำหรับ G ++]
สิ่งนี้ทำเพื่อป้องกันความขัดแย้ง
Handle, DWORD และ NULL ถูกกำหนดไว้ชั่วคราวภายใน pthread.h หากยังไม่ได้
ไม่เพียง แต่หลีกเลี่ยงความจำเป็นสำหรับไฟล์ pthread.def แต่เพื่อปรับปรุงประสิทธิภาพ เห็นได้ชัดว่าการประกาศฟังก์ชั่นด้วย dllimport สร้างการโทรโดยตรงไปยังฟังก์ชั่นและหลีกเลี่ยงค่าใช้จ่ายของการเรียกใช้ฟังก์ชันสตับ
สิ่งนี้สามารถทำให้แอปพลิเคชันโปร่งใสได้โดยการแทนที่มาโครที่กำหนด C ++ และ SEH เวอร์ชันปัจจุบันของ PTHREAD_CLEANUP_PUSH/POP ด้วยรุ่น C แต่ตัวจัดการการล้างข้อมูล AFAIK จะไม่ทำงานในลำดับที่ถูกต้อง .
การยกเลิกเมื่อเริ่มต้นในเธรดไม่สามารถยกเลิกได้สองครั้งโดยไม่ตั้งใจ นั่นคือเมื่อเธรดเริ่มต้นการยกเลิกการยกเลิกการยกเลิกจะถูกปิดใช้งานและคำขอยกเลิกที่ตามมาจะส่งคืนข้อผิดพลาด (ESRCH)
Errno: คำสั่งคอมไพเลอร์ที่ไม่ถูกต้องทำให้ Erno รุ่นท้องถิ่นใช้แทน Win32 Errno ทั้งสองอินสแตนซ์เป็นเธรดที่ปลอดภัย แต่แอปพลิเคชันตรวจสอบ errno หลังจากการโทร pthreads-win32 จะผิด การแก้ไขสิ่งนี้ยังแก้ไขตัวเลือกคอมไพเลอร์ที่ไม่ดีใน testsuite ( /mt ควรเป็น /md) ซึ่งจำเป็นต้องเชื่อมโยงกับไลบรารีที่ถูกต้อง msvcrt.lib
ที่จะเพิ่ม
ที่จะเพิ่ม
ใหม่:
Renamed DLL and LIB files:
pthreadVSE.dll (MS VC++/Structured EH)
pthreadVSE.lib
pthreadVCE.dll (MS VC++/C++ EH)
pthreadVCE.lib
pthreadGCE.dll (GNU G++/C++ EH)
libpthreadw32.a
Both your application and the pthread dll should use the
same exception handling scheme.
แก้ไขข้อบกพร่อง:
MSVC++ C++ exception handling.
มีการทดสอบใหม่บางอย่าง
ใหม่:
asynchronous cancellation on X86 (Jason Nye)
Makefile compatible with MS nmake to replace
buildlib.bat
GNUmakefile for Mingw32
tests/Makefile for MS nmake replaces runall.bat
tests/GNUmakefile for Mingw32
แก้ไขข้อบกพร่อง:
kernel32 load/free problem
attempt to hide internel exceptions from application
exception handlers (__try/__except and try/catch blocks)
Win32 thread handle leakage bug
(David Baggett/Paul Redondo/Eyal Lebedinsky)
มีการทดสอบใหม่บางอย่าง
แก้ไขข้อบกพร่อง:
ctime_r macro had an incorrect argument (Erik Hensema),
threads were not being created
PTHREAD_CANCEL_DEFERRED. This should have
had little effect as deferred is the only
supported type. (Ross Johnson).
เพิ่มการปรับปรุงความเข้ากันได้บางอย่างเช่น
pthread_setcancelstate accepts NULL pointer
for the previous value argument. Ditto for
pthread_setcanceltype. This is compatible
with Solaris but should not affect
standard applications (Erik Hensema)
มีการทดสอบใหม่บางอย่าง
การแก้ไขข้อผิดพลาด - การยกเลิกเธรดที่รอตัวแปรเงื่อนไขตอนนี้ทำงานได้อย่างถูกต้อง (Lorin Hochstein และ Peter Slacik)
แก้ไขข้อยกเว้นสแต็กการล้างข้อมูลหากโทร pthread_exit ()
แก้ไขข้อบกพร่องในตัวแปรเงื่อนไข - (Peter Slacik): - การตรวจสอบข้อโต้แย้งเพิ่มเติม - ปรับจำนวนเธรดรออย่างถูกต้องหลังจากหมดเวลา condvar หมดเวลา
ข้อบกพร่องเล็ก ๆ น้อย ๆ ได้รับการแก้ไขแล้ว ดูรายละเอียดไฟล์ Changelog
ขณะนี้มีฟังก์ชั่น Posix 1B เพิ่มเติม แต่ ONY ส่งคืนข้อผิดพลาด (enosys) หากเรียก พวกเขาคือ:
sem_open
sem_close
sem_unlink
sem_getvalue
ฟังก์ชั่น POSIX 1B บางอย่างที่รองรับภายในมีให้บริการในขณะนี้เป็นฟังก์ชั่นที่ส่งออก:
sem_init
sem_destroy
sem_wait
sem_trywait
sem_post
sched_yield
sched_get_priority_min
sched_get_priority_max
ข้อบกพร่องเล็ก ๆ น้อย ๆ ได้รับการแก้ไขแล้ว ดูรายละเอียดไฟล์ Changelog
การเปิดตัวครั้งแรก