Gabungan garpu pthread-win32
dari RedFox20 + Oktonion + WinBuild
PThread https://github.com/WinBuilds/pthread-win32 berubah:
Ini adalah fork versi 2.10.0.0 dari paket pthreads-win32. ABI fork ini berbeda dengan aslinya.
Perubahan dilakukan:
Jenis penghitung penggunaan kembali di ptw32_handle_t
telah diubah dari int
menjadi size_t
untuk memfasilitasi server yang berjalan lama.
Menghapus elemen yang tidak digunakan dari pthread_once_t
Pustaka ini sering diuji dengan proyek Visual Studio 2022 kami yang lain.
Umumnya saya menggunakan (dan telah menggunakan) file proyek MSVC20xx untuk pekerjaan saya. Makefile lebih jarang digunakan dan mungkin sudah ketinggalan zaman.
Harap perhatikan pesan penerapan d4b0ef6b: meskipun proyek MSVC2022/2019 telah dikonfigurasi agar sesuai dengan pengaturan internal saya , proyek tersebut mungkin tidak sesuai dengan pengaturan Anda.
Anda tentu saja selalu dapat mengedit pengaturan secara manual, tetapi ketika Anda perlu melakukan ini untuk banyak file proyek vcxproj
, tugas membuat skrip mungkin merupakan cara yang tepat. Lihat update-vcxproj.js
dan patch-vcxproj.js
untuk contoh skrip yang melakukan hal semacam ini. Saya menggunakannya untuk memastikan semua proyek C/C++ saya memiliki pengaturan build yang sama persis sehingga saya tidak mendapatkan kejutan run-time yang buruk karena beberapa proyek memutuskan untuk membangun dengan Perpustakaan Run Time Debug/Release Static/DLL yang sedikit berbeda, dll.dll.: jutaan cara yang bisa Anda dapatkan ?? oleh sistem build Anda di lingkungan Windows. Seru! ?
(2021-12-17)
Ini adalah rilis mikro dengan sebagian besar perbaikan administratif.
mkdir b && cd b && cmake -G "Visual Studio 16 2019" ..
: OK. Ini berarti bahwa beberapa bug yang mengintai telah diperbaiki dan kami telah menyertakan solusi untuk masalah CMake (saya masih tidak menyukai alat itu) ketika sumber C harus dikompilasi secara kondisional sebagai C++ (lihat juga pthread-EH.cpp dan pthread-JMP.c: dua file sumber pembungkus baru). Ini adalah rilis mikro dengan sebagian besar perbaikan administratif.
Build MSVC dan MinGW64 telah diuji pada arsitektur SMP (Intel x64 Hex Core) dengan menyelesaikan rangkaian pengujian yang disertakan, serta stress test dan bench test.
Pastikan untuk menjalankan build Anda terhadap test suite. Jika Anda melihat kegagalan, harap pertimbangkan bagaimana rantai alat Anda mungkin berkontribusi terhadap kegagalan tersebut. Lihat file README untuk penjelasan lebih rinci tentang rantai alat dan sistem pengujian yang telah kami gunakan agar pengujian berhasil.
Kami merekomendasikan MinGW64 dibandingkan MinGW untuk build GNU CC 64 dan 32 bit hanya karena penanganan pengecualian MinGW DWARF2 dengan build C++ menyebabkan beberapa masalah dengan pembatalan thread.
MinGW64 juga menyertakan implementasi pthreads aslinya, yang mungkin Anda lebih suka gunakan. Jika Anda ingin membangun perpustakaan kami, Anda harus memilih opsi thread asli Win32 pada waktu instalasi. Kami juga merekomendasikan memilih metode penanganan pengecualian SJLJ untuk build MinGW64-w32. Untuk build MinGW64-w64, metode penanganan pengecualian SJLJ atau SEH akan berfungsi.
(08-08-2018)
Perhatikan bahwa ini adalah rilis besar baru. Peningkatan versi utama memperkenalkan dua perubahan ABI bersama dengan perubahan penamaan lainnya yang memerlukan kompilasi ulang aplikasi yang menghubungkan dan mungkin beberapa perubahan tekstual pada referensi makro waktu kompilasi dalam konfigurasi dan file sumber, misalnya PTW32_* perubahan menjadi PTW32_ , ptw32_ menjadi ptw32_*, dll. .
Dengan persetujuan dari semua kontributor penting yang relevan pthreads-win32 / pthreads4w versi 3, dengan pengecualian empat file, dirilis berdasarkan ketentuan Lisensi Apache v2.0. APLv2 kompatibel dengan lisensi GPLv3 dan LGPLv3 dan oleh karena itu kode ini dapat terus disertakan secara hukum dalam proyek GPLv3 dan LGPLv3.
Kontributor relevan yang substansial didefinisikan sebagai orang yang telah menyumbangkan kode asli yang mengimplementasikan kemampuan yang ada dalam rilis selanjutnya. Hal ini tidak termasuk beberapa kontributor yang telah menyumbangkan kode yang sudah usang, atau telah memberikan patch yang memperbaiki bug, mengatur ulang kode untuk tujuan estetika atau praktis, atau meningkatkan proses pembangunan. Pembedaan ini diperlukan untuk melangkah maju karena kemungkinan tidak semua kontributor dapat dihubungi. Semua kontributor tercantum dalam file KONTRIBUTOR.
Empat file yang akan tetap menjadi LGPL tetapi berubah menjadi v3 adalah file yang digunakan untuk mengkonfigurasi lingkungan GNU:
aclocal.m4
configure.ac
GNUmakefile.in
tests/GNUmakefile.in
Kontributor yang telah meminta perubahan ini atau menyetujuinya saat berkonsultasi adalah:
Rilis pthreads-win32 / pthreads4w versi 2 akan tetap LGPL tetapi versi 2.11 dan yang lebih baru akan dirilis di bawah v3 dari lisensi tersebut sehingga penambahan apa pun pada kode pthreads4w versi 3 yang di-backport ke v2 tidak akan mencemari kode tersebut.
Beberapa perubahan mulai 26-02-2011 dan seterusnya mungkin tidak kompatibel dengan sistem sebelum Windows 2000.
Perbaikan bug baru di semua rilis sejak 2.8.0 BELUM diterapkan pada seri 1.xx.
Build MSVC, MinGW, dan MinGW64 telah diuji pada arsitektur SMP (Intel x64 Hex Core) dengan menyelesaikan rangkaian pengujian yang disertakan, serta stress test dan bench test.
Pastikan untuk menjalankan build Anda terhadap test suite. Jika Anda melihat kegagalan, harap pertimbangkan bagaimana rantai alat Anda mungkin berkontribusi terhadap kegagalan tersebut. Lihat file README untuk penjelasan lebih rinci tentang rantai alat dan sistem pengujian yang telah kami gunakan agar pengujian berhasil.
Kami merekomendasikan MinGW64 dibandingkan MinGW untuk build GNU CC 64 dan 32 bit hanya karena penanganan pengecualian MinGW DWARF2 dengan build C++ menyebabkan beberapa masalah dengan pembatalan thread.
MinGW64 juga menyertakan implementasi pthreads aslinya, yang mungkin Anda lebih suka gunakan. Jika Anda ingin membangun perpustakaan kami, Anda harus memilih opsi thread asli Win32 pada waktu instalasi. Kami juga merekomendasikan memilih metode penanganan pengecualian SJLJ untuk build MinGW64-w32. Untuk build MinGW64-w64, metode penanganan pengecualian SJLJ atau SEH akan berfungsi.
Selain yang berikut ini, rilis ini memiliki fitur yang setara dengan v2.11.0.
Rilis ini memperkenalkan perubahan pada pthread_t dan pthread_once_t yang akan mempengaruhi aplikasi yang terhubung dengan perpustakaan.
pthread_t: tetap berupa struct tetapi memperluas penghitung penggunaan kembali dari 32 bit menjadi 64 bit. Pada mesin 64 bit, ukuran keseluruhan objek tidak akan bertambah, kita cukup menggunakan padding 4 byte untuk mengurangi risiko bahwa penghitung dapat membungkus aplikasi yang berjalan sangat lama dari yang kecil hingga, secara efektif, nol. Penghitung penggunaan kembali 64 bit memperpanjang waktu pengoperasian bebas risiko dari berbulan-bulan (dengan asumsi masa pakai thread rata-rata 1 ms) hingga berabad-abad (dengan asumsi masa pakai thread rata-rata 1ns).
pthread_once_t: menghapus dua elemen yang sudah lama usang dan mengurangi ukurannya.
(08-08-2018)
Perbaikan bug baru di semua rilis sejak 2.8.0 BELUM diterapkan pada seri 1.xx.
Beberapa perubahan mulai 26-02-2011 dan seterusnya mungkin tidak kompatibel dengan sistem sebelum Windows 2000.
pthreads-win32 / pthreads4w versi 2.11 dan semua versi 2.x di masa depan akan dirilis di bawah Lesser GNU Public License versi 3 (LGPLv3).
Versi utama berikutnya dari perangkat lunak ini (versi 3) akan dirilis di bawah Lisensi Apache versi 2.0 (ALv2). Merilis 2.11 di bawah LGPLv3 akan memungkinkan modifikasi versi 3 perangkat lunak ini di-backport ke versi 2 di masa mendatang. Selain itu, setiap proyek GPL yang saat ini menggunakan perpustakaan ini akan dapat terus menggunakan versi 2 atau 3 dari kode ini dalam proyek mereka.
Untuk informasi lebih lanjut silakan lihat: https://www.apache.org/licenses/GPL-compatibility.html
Agar tetap konsisten dengan perubahan ini, mulai saat ini modifikasi pada perpustakaan ini hanya akan diterima terhadap versi 3 perangkat lunak ini berdasarkan ketentuan ALv2. Mereka kemudian, jika diperlukan, akan di-backport ke versi 2.
Kami berharap untuk merilis versi 3 bersamaan dengan kami merilis versi 2.11.
Versi ini telah diuji pada arsitektur SMP (Intel x64 Hex Core) dengan menyelesaikan rangkaian pengujian yang disertakan, serta stress dan bench test.
Pastikan untuk menjalankan build Anda terhadap test suite. Jika Anda melihat kegagalan, harap pertimbangkan bagaimana rantai alat Anda mungkin berkontribusi terhadap kegagalan tersebut. Lihat file README untuk penjelasan lebih rinci tentang rantai alat dan sistem pengujian yang telah kami gunakan agar pengujian berhasil. Kami merekomendasikan MinGW64 daripada MinGW32 untuk versi GNU CC 64 dan 32 bit. MinGW64 juga menyertakan implementasi pthreads independennya sendiri, yang mungkin Anda lebih suka gunakan.
Untuk pembuatan rantai alat Microsoft: (1) Penautan statis memerlukan pustaka ini dan pustaka atau aplikasi penautan apa pun untuk dikompilasi dengan /MT secara konsisten.
(2) Pustaka statis telah diganti namanya menjadi libpthreadV*.lib untuk membedakannya dari lib impor DLL pthreadV*.lib.
(3) Jika Anda menggunakan tautan campuran, misalnya menautkan perpustakaan versi statis /MT ke aplikasi yang terhubung dengan /MD, Anda mungkin dapat menggunakan GetLastError() untuk menginterogasi kode kesalahan karena perpustakaan menyetel keduanya errno (melalui _set_errno ()) dan SetLastError().
Hapus upaya untuk mengatur PTW32_USES_SEPARATE_CRT di header yang dapat menyebabkan hasil yang tidak diharapkan. Dalam situasi tertentu pengguna mungkin ingin mendefinisikannya secara eksplisit di lingkungannya untuk menerapkan efeknya, baik saat membangun perpustakaan atau aplikasi atau keduanya. Lihat README.NONPORTABLE. --Ross Johnson
Perpustakaan harus lebih dapat diandalkan dalam skenario yang sepenuhnya terhubung secara statis. Catatan: kami telah menghapus kode PIMAGE_TLS_CALLBACK dan mengembalikan ke metode sebelumnya yang tampaknya lebih dapat diandalkan di semua edisi kompiler.
Berbagai koreksi pada GNUmakefile. Meskipun file ini telah dihapus, demi kelengkapan perubahannya telah dicatat sebagai komitmen pada repositori.
MinGW64-w64 mendefinisikan pid_t sebagai __int64. sched.h sekarang mencerminkan hal itu.
Beberapa pengujian telah diperbaiki yang terlihat gagal pada mesin yang diberi beban. Pengujian lain yang menggunakan mekanisme kasar serupa untuk menyinkronkan thread (ini adalah pengujian unit) menerapkan peningkatan yang sama: semaphore5.c mengenali bahwa sem_destroy dapat mengembalikan EBUSY secara sah; mutex6*.c, mutex7*.c dan mutex8*.c semuanya menggantikan satu Sleep() dengan loop polling.
(18-09-2016)
Perbaikan bug baru di semua rilis sejak 2.8.0 BELUM diterapkan pada seri 1.xx.
Beberapa perubahan mulai 26-02-2011 dan seterusnya mungkin tidak kompatibel dengan sistem sebelum Windows 2000.
Versi ini telah diuji pada arsitektur SMP (Intel x64 Hex Core) dengan menyelesaikan rangkaian pengujian yang disertakan, serta stress dan bench test.
Pastikan untuk menjalankan build Anda terhadap test suite. Jika Anda melihat kegagalan, harap pertimbangkan bagaimana rantai alat Anda mungkin berkontribusi terhadap kegagalan tersebut. Lihat file README untuk penjelasan lebih rinci tentang rantai alat dan sistem pengujian yang telah kami gunakan agar pengujian berhasil. Kami merekomendasikan MinGW64 daripada MinGW32 untuk versi GNU CC 64 dan 32 bit. MinGW64 juga menyertakan implementasi pthreads independennya sendiri, yang mungkin Anda lebih suka gunakan.
Rutinitas baru: 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()
Lingkungan kompiler GNU (MinGW32 dan MinGW64) sekarang memiliki opsi untuk menggunakan autoconf untuk mengonfigurasi build secara otomatis.
Build: Target makefile baru telah ditambahkan dan target yang ada diubah atau dihapus. Misalnya, menargetkan untuk membangun dan menguji semua kemungkinan konfigurasi dll dan lib statis.
Build kompiler GNU sekarang secara eksplisit menggunakan kompatibilitas standar ISO C dan C++ 2011. Jika kompiler GNU Anda tidak mendukung hal ini, harap pertimbangkan untuk memperbarui. Konfigurasi otomatis sekarang dapat dilakukan melalui skrip 'konfigurasi'. Skrip harus dibuat menggunakan autoconf - lihat file README. Terima kasih kepada Keith Marshall dari proyek MinGW.
Tautan statis: Fungsi otomatis telah dipindahkan ke dll.c, dan diperluas sehingga build menggunakan MSVC8 dan versi lebih baru tidak lagi memerlukan aplikasi untuk memanggil pthread_win32_thread_detach_np(). Artinya, semua fungsi DllMain sekarang otomatis untuk tautan statis untuk build ini.
Beberapa target penautan statis nmake telah dinonaktifkan: Karena masalah dengan perilaku TLS, target nmake V*-small-static* di Makefile telah dinonaktifkan. Masalah ini terungkap oleh tes/semaphore3.c di mana panggilan pthread_self() di dalam utas gagal mengembalikan pegangan utas POSIX yang benar tetapi malah mengembalikan pegangan utas POSIX "implisit" yang baru. Pegangan pthread implisit memiliki status thread yang terlepas, yang menyebabkan panggilan pthread_detach() di dalam thread mengembalikan EINVAL. Target V*-static* tampaknya tidak terpengaruh. Perbedaan utamanya adalah bahwa yang terakhir dihasilkan dari satu unit kompilasi.
Tautan statis file objek kecil sekarang berfungsi (MinGW). Kode autostatik diperlukan tetapi tidak ada yang secara eksplisit mereferensikan kode ini sehingga dioptimalkan.
sem_getvalue() dapat mengembalikan nilai errno alih-alih menyetel errno dan mengembalikan -1.
Nilai-nilai Errno hilang jika perpustakaan terhubung secara statis dengan perpustakaan runtime, artinya aplikasi tersebut menggunakan instance runtime terpisah. Hal ini masih terjadi kecuali saklar build telah ditambahkan yang memungkinkan status kesalahan yang lebih kuat untuk dimasukkan, yaitu memungkinkan kode kembalian diambil melalui GetLastError().
Mengidentifikasi penyebab kegagalan signifikan seputar pembatalan dan pthread_exit() untuk konfigurasi build GCE (GNU C++) yang berasal dari Mingw32. Tidak yakin apakah ini bersifat umum atau hanya ketika membangun perpustakaan dan aplikasi 32 bit yang berjalan pada sistem 64 bit. Kegagalan ini tidak terjadi pada Mingw64 build 32 bit (GCC dibuat dengan multilib diaktifkan) yang berjalan pada sistem 64 bit.
bug pthread_key_delete() yang diperkenalkan pada rilis 2.9.x menyebabkan rutinitas ini gagal sehingga rangkaian pengujian tidak terdeteksi. Tes baru telah ditambahkan untuk mengonfirmasi bahwa rutinitas ini berfungsi dengan benar, terutama ketika kunci dengan destruktor dihapus sebelum thread keluar.
pthread_win32_process_attach_np() memperbaiki potensi kegagalan/keamanan saat menemukan dan memuat QUSEREX.DLL.
_POSIX_THREAD_ATTR_STACKADDR sekarang disetel sama dengan -1 di pthread.h. Sebagai konsekuensinya pthread_attr_setstackaddr() sekarang mengembalikan ENOSYS. Sebelumnya nilai disimpan dan dapat diambil tetapi sebaliknya tidak digunakan. pthread_attr_getstackaddr() mengembalikan ENOSYS secara bersamaan.
Memperbaiki potensi kebocoran memori di pthread_mutex_init(). Kebocoran hanya akan terjadi jika inisialisasi mutex gagal (sangat jarang terjadi).
Memperbaiki batas waktu sub-milidetik, yang menyebabkan perpustakaan sibuk menunggu.
Perbaiki kondisi balapan dan kerusakan pada kunci MCS. Kode manajemen antrian pelayan di ptw32_mcs_lock_acquire berpacu dengan kode manajemen antrian di ptw32_mcs_lock_release dan menyebabkan kesalahan segmentasi.
(27-05-2012)
Perbaikan bug baru dalam rilis ini sejak 2.8.0 BELUM diterapkan pada seri 1.xx.
Rilis ini menggantikan rilis 2.9.0 yang sangat singkat dan menambahkan beberapa perubahan non-kode di menit-menit terakhir yang dibuat untuk menyematkan properti deskriptif yang lebih baik di dll untuk menunjukkan arsitektur target dan lingkungan pembangunan.
Beberapa perubahan pasca 26-02-2011 di CVS mungkin tidak kompatibel dengan sistem sebelum Windows 2000.
Penggunaan perpustakaan selain versi "C" sekarang tidak disarankan. Artinya, versi "C++" gagal dalam beberapa pengujian dan tidak menyediakan fungsionalitas tambahan apa pun.
Versi ini telah diuji pada arsitektur SMP (Intel x64 Hex Core) dengan menyelesaikan test suite, stress dan bench test yang disertakan.
Properti DLL sekarang mencakup arsitektur target dengan benar, yaitu klik kanan pada file pthreadVC2.dll di explorer dan pilih tab Detail akan menampilkan kompiler dan arsitektur di kolom deskripsi, misalnya "MS C x64" atau "MS C x86".
Ketergantungan pada perpustakaan winock sekarang bersifat opsional melalui #define RETAIN_WSALASTERROR
di config.h. Ini tidak ditentukan secara default kecuali WINCE ditentukan (karena saya (RJ) tidak yakin dengan ketergantungan di sana).
(Build MSC dan GNU) Pustaka yang terhubung secara statis sekarang secara otomatis menginisialisasi dan membersihkan saat program mulai/keluar, yaitu aplikasi yang terhubung secara statis tidak perlu memanggil rutinitas pthread_win32_process_attach_np() dan pthread_win32_process_detach_np() secara eksplisit. Rutin per-thread pthread_win32_thread_detach_np() juga dipanggil saat keluar program untuk membersihkan sumber daya POSIX yang diperoleh oleh thread asli Windows utama, jika saya (RJ) memahami prosesnya dengan benar. Thread asli Windows lainnya yang memanggil rutinitas POSIX API mungkin perlu memanggil rutin pelepasan thread saat keluar dari thread jika aplikasi bergantung pada sumber daya POSIX yang diklaim ulang atau menjalankan destruktor POSIX TSD (TLS). Lihat README.NONPORTABLE untuk deskripsi rutinitas ini.
Mutex yang kuat diimplementasikan dalam lingkup PROCESS_PRIVATE. PERHATIKAN bahwa fungsi pthread_mutex_* dapat mengembalikan kode kesalahan yang berbeda untuk mutex yang kuat dibandingkan dengan penggunaan normal, misalnya pthread_mutex_unlock diperlukan untuk memeriksa kepemilikan semua jenis mutex ketika mutex kuat, sedangkan hal ini tidak terjadi untuk non- tipe mutex yang kuat.
pthread_getunique_np diimplementasikan untuk kompatibilitas tingkat sumber dengan beberapa implementasi lainnya. Rutin ini mengembalikan nomor urut 64 bit yang secara unik dikaitkan dengan thread. Ini dapat digunakan oleh aplikasi untuk memesan atau melakukan hash pada pegangan thread POSIX.
Masih banyak lagi perubahan untuk sistem 64 bit.
Berbagai modifikasi dan perbaikan untuk membangun dan menguji WinCE.
Perbaiki pthread_cond_destroy() - tidak boleh menjadi titik pembatalan. Masalah pembangunan kecil lainnya telah diperbaiki.
Hapus potensi kondisi kebuntuan dari pthread_cond_destroy().
Berbagai modifikasi untuk dibangun dan diuji untuk Win64.
Berbagai perbaikan pada DLL pembantu pembatalan async QueueUserAPCEx (ini adalah unduhan terpisah) dan pembersihan kode pthreads.
Menghapus potensi referensi penunjuk NULL.
Menghapus persyaratan bahwa aplikasi membatasi jumlah thread yang memanggil pthread_barrier_wait hanya pada jumlah penghalang. Juga mengurangi pertikaian antara penghalang_tunggu dan penghalang_penghancur. Perubahan ini akan sedikit memperlambat hambatan tetapi mengurangi separuh jumlah semaphore yang dikonsumsi per penghalang menjadi satu.
Memperbaiki kebocoran pegangan di sched_[gs]etscheduler.
Menghapus semua makro kompatibilitas fungsi peserta kembali POSIX dari pthread.h. Beberapa di antaranya tidak benar secara semantik.
Thread tidak lagi mencoba meneruskan pengecualian yang tidak tertangkap di luar cakupan thread (hanya build C++ dan SEH). Pengecualian yang tidak tertangkap sekarang menyebabkan thread keluar dengan kode pengembalian PTHREAD_CANCELED.
Banyak perbaikan casting khususnya untuk x64, perbaikan yang saling bertautan dan pengerjaan ulang untuk x64.
Ketergantungan pada perpustakaan winock sekarang bersifat opsional melalui #define RETAIN_WSALASTERROR
di config.h. Ini tidak ditentukan secara default kecuali WINCE ditentukan (karena RJ tidak yakin dengan ketergantungan di sana).
Beberapa mutex POSIX statis yang digunakan untuk manajemen internal digantikan oleh kunci berbasis antrian MCS untuk mengurangi konsumsi sumber daya, khususnya penggunaan objek Win32.
Demi keamanan, QuserEx.dll jika digunakan sekarang harus diinstal di folder Sistem Windows.
kuat[1-5].c - Mutex yang kuat sequence1.c - nomor urut unik per-thread
Semua pengujian mutex*.c jika diperlukan telah dimodifikasi untuk juga menguji mutex yang kuat dalam kondisi yang sama. Menambahkan tes bangku mutex yang kuat ke benchtest*.c jika diperlukan.
(22-12-2006)
Perbaikan bug baru pada rilis ini sejak 2.7.0 belum diterapkan pada seri versi 1.xx. Mungkin sudah waktunya untuk menghentikan versi 1.
Rilis ini belum diuji pada arsitektur SMP. Semua tes lulus pada sistem uni-prosesor.
Sem_destroy dapat mengembalikan EBUSY meskipun tidak ada thread yang menunggu di semaphore. Perlombaan lain seputar pembatalan struct semaphore (secara internal) juga telah dihapus.
semaphore5.c - menguji perbaikan bug yang disebutkan di atas.
(2005-06-04)
Semua fitur baru dalam rilis ini telah di-back-port pada rilis 1.11.0, termasuk penggabungan kunci MCS di pthread_once, namun, versi 1 dan 2 tetap tidak kompatibel meskipun kinerja dan fungsinya sekarang identik.
Rilis ini telah diuji (lulus rangkaian pengujian) pada sistem uni-prosesor dan multi-prosesor.
Pthread_once telah diimplementasikan kembali untuk menghilangkan peningkatan prioritas dan kompleksitas lainnya untuk meningkatkan ketahanan. Perlombaan untuk pegangan Win32 yang tidak unik untuk daur ulang telah dihapus. Bentuk umum pthread_once sekarang sama dengan yang disarankan sebelumnya oleh Alexander Terekhov, namun alih-alih 'bernama mutex', kunci berbasis antrean telah diterapkan yang memiliki properti yang diperlukan untuk inisialisasi dan penghancuran diri dinamis. Kunci ini juga efisien. ABI tidak terpengaruh selama ukuran pthread_once_t tidak berubah dan PTHREAD_ONCE_INIT tidak berubah, namun, aplikasi yang mengintip ke dalam pthread_once_t, yang seharusnya buram, akan rusak.
(2005-05-19)
Semua perbaikan bug dan fitur baru dalam rilis ini telah di-back-port pada rilis 1.10.0.
Rilis ini telah diuji (lulus rangkaian pengujian) pada sistem uni-prosesor dan multi-prosesor. Terima kasih kepada Tim Theisen di TomoTherapy yang telah menjalankan pengujian MP secara mendalam dan menyediakan pengamatan serta data penting ketika kesalahan terdeteksi.
(2005-05-09)
Paket ini sekarang menyertakan kumpulan dokumentasi referensi yang terdiri dari halaman manual gaya Unix berformat HTML yang telah diedit agar konsisten dengan pthreads-win32. Set ini juga dapat dibaca online di: http://sources.redhat.com/pthreads-win32/manual/index.html
Sekali lagi terima kasih kepada Tim Theisen karena telah menjalankan rangkaian pengujian pra-rilis pada sistem MP.
Semua perbaikan bug dan fitur baru dalam rilis ini telah di-back-port pada rilis 1.9.0.
Implementasi yang diubah menghindari kebutuhan akan HANDLE yang bermasalah dan mendapatkan kembali memori segera setelah kunci dihapus ATAU thread keluar, mana saja yang lebih dulu.
Terima kasih kepada Richard Hughes di Aculab yang telah mengidentifikasi dan menemukan lokasi kebocoran.
Penghancur kunci TSD kini diproses hingga PTHREAD_DESTRUCTOR_ITERATIONS kali, bukan hanya sekali. PTHREAD_DESTRUCTOR_ITERATIONS telah didefinisikan di pthread.h selama beberapa waktu tetapi tidak digunakan.
Memperbaiki perlombaan akuntansi semaphore antara pembatalan sem_post/sem_post_multiple dan sem_wait. Ini adalah masalah yang sama dengan sem_timedwait yang telah diperbaiki pada rilis terakhir.
sem_init, sem_post, dan sem_post_multiple sekarang periksa apakah jumlah semaphore tidak pernah melebihi _POSIX_SEM_VALUE_MAX.
Meskipun sigwait() tidak lebih dari larangan operasi, setidaknya ini harus menjadi titik pembatalan agar konsisten dengan standar.
stress1.c - mencoba mengungkap masalah dalam variabel kondisi dan logika tunggu berjangka waktu semaphore. Pengujian ini terinspirasi oleh contoh kode pengujian Stephan Mueller yang digunakan untuk mengidentifikasi bug sem_timedwait dari rilis terakhir. Ini bukan bagian dari rangkaian pengujian reguler karena memerlukan waktu beberapa saat untuk dijalankan. Untuk menjalankannya: nmake clean VC-stress
tsd2.c - menguji apakah destruktor kunci dijalankan kembali jika nilai kunci tsd bukan NULL setelah rutinitas destruktor dijalankan. Juga menguji apakah pthread_setspecial() dan pthread_getspecial() dapat dipanggil dari destruktor.
(26-04-2005)
Saat ini tidak ada rencana untuk merilis versi 3.0.0 untuk memperbaiki masalah di pthread_once(). Kemungkinan implementasi pthread_once lainnya masih akan diselidiki untuk kemungkinan rilis di masa mendatang dalam upaya mengurangi kompleksitas implementasi saat ini.
Semua perbaikan bug dan fitur baru dalam rilis ini telah di-back-port untuk rilis 1.8.0.
Memperbaiki balapan pthread_once (kegagalan pada sistem MP). Terima kasih kepada Tim Theisen yang telah menjalankan pengujian pra-rilis menyeluruh pada sistem MP miliknya menggunakan serangkaian kompiler: VC++ 6 VC++ 7.1 Intel C++ versi 8.0 Semua pengujian berhasil. Beberapa peningkatan kecepatan kecil juga dilakukan.
Memperbaiki kesalahan integer overrun di pthread_mutex_timedlock() - tidak terjawab saat sem_timedwait() diperbaiki pada rilis 2.2.0. Rutinitas ini tidak lagi mengembalikan ENOTSUP ketika NEED_SEM ditentukan - rutin ini didukung (NEED_SEM hanya diperlukan untuk versi WinCE sebelum 3.0).
Perbaiki bug batas waktu di sem_timedwait().
Perbaiki beberapa masalah dalam kode NEED_SEM yang disertakan secara kondisional. Kode yang disertakan NEED_SEM disediakan untuk sistem yang tidak mengimplementasikan semafor W32, seperti WinCE sebelum versi 3.0. Implementasi alternatif semafor POSIX dibangun menggunakan peristiwa W32 untuk sistem ini ketika NEED_SEM ditentukan. Kode ini telah sepenuhnya ditulis ulang dalam rilis ini untuk menggunakan kembali sebagian besar kode semaphore POSIX default, dan khususnya, untuk mengimplementasikan semua rutinitas sem_* yang didukung oleh pthreads-win32. Tim Theisen juga menjalankan test suite melalui kode NEED_SEM pada sistem MP-nya. Semua tes lulus.
Perpustakaan sekarang dibangun tanpa kesalahan untuk kompiler Borland Builder 5.5.
pthread_once terlalu rumit - tetapi berfungsi sejauh pengujian dapat menentukan..
Versi Borland dari dll gagal dalam beberapa pengujian dengan pengecualian pembacaan memori. Penyebabnya belum diketahui tetapi bug kompiler belum dikesampingkan.
(2005-04-12)
Rilis 1.7.0 merupakan backport fitur dan perbaikan bug baru dalam rilis ini. Lihat catatan sebelumnya pada Rilis 2.0.0/Umum.
(2005-04-04)
Menambahkan target makefile untuk membuat versi tautan statis perpustakaan. Baik MinGW dan MSVC. Harap diperhatikan bahwa hal ini tidak berarti perubahan apa pun terhadap lisensi LGPL, yang masih menerapkan ketentuan khusus pada pendistribusian perangkat lunak yang telah ditautkan secara statis dengan perpustakaan ini.
Ada bug yang diketahui di pthread_once(). Pembatalan init_routine menimbulkan potensi masalah kelaparan (yaitu kebuntuan) jika thread yang menunggu memiliki prioritas lebih tinggi daripada thread yang memulai. Masalah ini akan diperbaiki di perpustakaan versi 3.0.0.
Perbaiki kesalahan integer overrun di sem_timedwait(). Kevin Lussier
Perbaiki arahan praprosesor untuk tautan statis. Dimitar Panayotov
(2005-03-16)
(2005-03-16)
Rilis ini mewakili perubahan ABI dan penamaan versi DLL telah bertambah dari 1 menjadi 2, misalnya pthreadVC2.dll.
Versi 1.4.0 mendukung fungsi baru yang disertakan dalam rilis ini. Silakan distribusikan DLL yang dibuat dari versi tersebut dengan pembaruan untuk aplikasi yang dibangun di pthreads-win32 versi 1.xx
Penamaan paket telah berubah, menggantikan tanggal snapshot dengan nomor versi + informasi deskriptif. Misalnya rilis ini adalah "pthreads-win32-2-0-0-release".
Versi 1.3.0
Versi 1.2.0
Versi 1.1.0
Versi 1.0.0
Snapshot ini terutama memperbaiki bug condvar yang diperkenalkan di Snapshot-2004-11-03. Versi DLL juga telah dimasukkan untuk memungkinkan aplikasi untuk memeriksa informasi versi DLL yang kompatibel dengan Microsoft, dan untuk memperluas sistem penamaan DLL untuk API ABI dan Mayor (Non-Backward Compatible). Lihat file ReadMe untuk detailnya.
Sumber daya versi gaya Microsoft telah ditambahkan ke DLL untuk aplikasi yang ingin memeriksa kompatibilitas DLL saat runtime.
Penamaan DLL Pthreads-Win32 telah diperluas untuk memungkinkan versi DLL yang tidak kompatibel untuk hidup berdampingan dalam sistem file yang sama. Lihat file ReadMe untuk detailnya, tetapi secara singkat: Sementara informasi versi di dalam DLL akan berubah dengan setiap rilis mulai sekarang, nama versi DLL hanya akan berubah jika DLL baru tidak kompatibel dengan aplikasi yang lebih lama.
Skema versi telah dipinjam dari GNU LIBTOOL, dan skema penamaan DLL berasal dari Cygwin. Asalkan aturan penomoran gaya LIBTOOL dihormati, skema penamaan Cygwin DLL secara otomatis memastikan bahwa perubahan nama dll minimal dan bahwa aplikasi tidak akan memuat Pthreads-Win32 DLL yang tidak kompatibel.
Mereka yang menggunakan DLL pra-dibangun akan menemukan bahwa nama DLL/LIB memiliki akhiran baru (1) dalam snapshot ini. Misalnya pthreadvc1.dll dll.
Makro POSIX tertentu telah berubah.
Perubahan ini dimaksudkan untuk menyesuaikan diri dengan spesifikasi UNIX tunggal versi 3, yang menyatakan bahwa, jika diatur ke 0 (nol) atau tidak ditentukan, maka aplikasi dapat menggunakan sysconf () untuk menentukan nilainya saat runtime. Pthreads-Win32 tidak mengimplementasikan sysconf ().
Makro berikut tidak lagi tidak terdefinisi, tetapi didefinisikan dan diatur ke -1 (tidak diimplementasikan):
_POSIX_THREAD_ATTR_STACKADDR
_POSIX_THREAD_PRIO_INHERIT
_POSIX_THREAD_PRIO_PROTECT
_POSIX_THREAD_PROCESS_SHARED
Makro berikut didefinisikan dan ditetapkan ke 200112L (diimplementasikan):
_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
Makro berikut didefinisikan dan diatur ke nilai yang sesuai:
_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 yang diproduksi dari snapshot ini tidak dapat digunakan dengan aplikasi yang lebih lama tanpa mengkompilasi ulang aplikasi, karena perubahan ke PTHREAD_T untuk menyediakan ID utas POSIX yang unik.
Meskipun snapshot ini melewati rangkaian tes yang diperluas, banyak perubahan yang cukup besar, dan beberapa aplikasi mungkin menunjukkan perilaku yang berbeda dari sebelumnya, jadi adopsi dengan hati -hati. Mudah -mudahan, perilaku yang berubah akan disebabkan oleh perpustakaan yang lebih baik dalam pekerjaannya, tidak lebih buruk.
pthread_create () tidak lagi menerima null sebagai arg referensi utas. Segfault (kesalahan akses memori) akan terjadi, dan tidak ada utas yang akan dibuat.
pthread_barrier_wait () tidak lagi bertindak sebagai titik pembatalan.
Memperbaiki kondisi balapan potensial di pthread_once ()
Ditambahkan untuk kompatibilitas: pthread_recursive_mutex_initializer, pthread_errorcheck_mutex_initializer, pthread_recursive_mutex_initializer_np, pthread_errorcheck_mutex_initializer_np
Dukungan Awal untuk Kompiler Digital Mars
Mutex yang lebih cepat. Ini telah ditulis ulang mengikuti model yang disediakan oleh Alexander Terekhov yang mengurangi pemeriksaan ruang kernel, dan menghilangkan beberapa bagian kritis tambahan yang digunakan untuk mengelola perlombaan antara waktu kedaluwarsa dan membuka kunci. Perlu diketahui bahwa mutex baru tidak menegakkan penjadwalan FIFO mutex absolut yang ketat, namun akuisisi kunci out-of-order harus sangat jarang.
Semaphores yang lebih cepat. Mengikuti model serupa dengan mutex di atas, ini telah ditulis ulang untuk menggunakan pemeriksaan ruang pengguna awal.
sem_getValue () sekarang mengembalikan jumlah pelayan.
ID utas POSIX sekarang memiliki karakteristik keunikan yang jauh lebih kuat. Perpustakaan Garrantees untuk tidak menggunakan kembali ID utas yang sama untuk setidaknya 2^(WordSize) siklus penghancuran/penciptaan utas.
semaphore4.c: menguji pembatalan sem_wait baru ().
Semaphore4t.c: Demikian juga untuk sem_timedwait ().
rwlock8.c: Tes dan kali jalur eksekusi lambat dari kunci R/W, dan CV, mutex, dan semafor yang dibangun.
Cobalah untuk menambahkan Watcom ke daftar kompiler yang dapat membangun perpustakaan. Ini gagal pada akhirnya karena errno non-thread-sadar. Perpustakaan membangun tetapi suite tes gagal. Lihat readme.watcom untuk detail lebih lanjut.
Catatan: Jika Anda tidak menggunakan pembatalan async di aplikasi Anda, atau tidak perlu membatalkan utas yang diblokir pada sumber daya sistem seperti I/O jaringan, maka pembatalan async non-preemptive default mungkin cukup baik. Namun, pthreads-win32 mendeteksi secara otomatis ketersediaan komponen-komponen ini saat run-time, jadi Anda tidak perlu membangun kembali perpustakaan dari sumber jika Anda berubah pikiran nanti.
Semua saran yang tersedia dalam buku dan di tempat lain tentang tidak diinginkan menggunakan pembatalan async dalam aplikasi apa pun masih ada, tetapi fitur ini merupakan tambahan yang disambut baik sehubungan dengan kesesuaian perpustakaan dengan standar POSIX.
Pembersihan manajemen prioritas utas. Secara khusus, pengaturan prioritas utas sekarang berupaya memetakan nilai Win32 yang tidak valid dalam kisaran yang dikembalikan oleh SCHART_GET_PRIORITY_MIN/MAX () ke nilai yang bermanfaat. Lihat readme.nonportable di bawah "Thread Prioritas".
pthread_getschedparam () sekarang mengembalikan prioritas yang diberikan oleh panggilan terbaru ke pthread_setschedparam () atau ditetapkan oleh pthread_create (), sebagaimana disyaratkan oleh standar. Sebelumnya, pthread_getschedparam () salah mengembalikan prioritas utas yang berjalan pada saat panggilan, yang mungkin telah disesuaikan atau dipromosikan untuk sementara/diturunkan.
SCHART_GET_PRIORITY_MIN () dan SCHART_GET_PRIORITY_MAX () Sekarang return -1 pada kesalahan dan atur errno. Sebelumnya, mereka secara tidak benar mengembalikan nilai kesalahan secara langsung.
pthread_self () akan membebaskan pegangan utas POSIX implisit yang baru dibuat jika duplikathandle gagal alih -alih mendaur ulang (sangat tidak mungkin).
pthread_exit () tidak membebaskan atau mendaur ulang struct utas POSIX untuk utas POSIX implisit.
Sejak implementasi asli John Bossom, perpustakaan telah memungkinkan utas inisialisasi non-Posix (utas Win32) untuk memanggil rutinitas pthreads-Win32 dan karenanya berinteraksi dengan utas POSIX. Ini dilakukan dengan membuat ID utas POSIX on-the-fly untuk utas Win32 yang, setelah dibuat, memungkinkan interaksi sepenuhnya timbal balik. Ini tidak meluas ke pembatalan utas (async atau ditangguhkan). Sekarang itu terjadi.
Utas apa pun dapat dibatalkan oleh utas lain (Win32 atau POSIX) jika nilai POSIX PTHREAD_T utas sebelumnya diketahui. Ini adalah TSD Destructors dan Handlers POSIX CLEANUP akan dijalankan sebelum utas keluar dengan kode keluar PTHREAD_CANCELED (diambil dengan getExitCodethread ()).
Ini memungkinkan utas Win32 untuk, misalnya, hubungi rutinitas CV POSIX dengan cara yang sama seperti halnya utas POSIX, dengan phThread_cond_wait () dapat dibatalkan dan penangan pembersihan (pthread_cond_wait () adalah titik pembatalan POSIX).
Dengan menambahkan pembatalan, win32 utas sekarang harus dapat memanggil semua rutinitas utas POSIX yang masuk akal termasuk semafor, mutex, variabel kondisi, kunci baca/tulis, hambatan, spinlock, tsd, dorongan/pop, pembatalan, pthread_exit, penjadwalan, dll .
Perhatikan bahwa ID utas POSIX yang 'implisit' ini diinisialisasi sebagai terpisah (tidak dapat digabungkan) dengan tipe pembatalan yang ditangguhkan. ID utas POSIX akan dibuat secara otomatis oleh rutinitas POSIX yang membutuhkan pegangan POSIX (kecuali rutin membutuhkan PTHREAD_T sebagai parameter tentu saja). Utas Win32 dapat menemukan ID utas POSIX sendiri dengan memanggil pthread_self (), yang akan membuat pegangan jika perlu dan mengembalikan nilai pthread_t.
Uji fitur baru di atas.
Snapshot ini memperbaiki beberapa korupsi yang tidak disengaja pada sumber kasus uji baru. Tidak ada perubahan pada kode sumber perpustakaan.
Berbagai perubahan untuk memperketat pemeriksaan arg, dan untuk bekerja dengan versi Mingw32 dan msysdtk yang lebih baru.
pthread_getschedparam () dll, Memperbaiki Pemeriksaan Validitas Benang Berbahaya.
sem_timedwait () sekarang menggunakan pemeriksaan yang lebih ketat untuk nilai abstime yang tidak masuk akal - yang akan menghasilkan nilai batas waktu yang tidak terduga.
ptw32_cond_wait_cleanup () tidak lagi secara misterius mengkonsumsi sinyal CV tetapi dapat menghasilkan lebih banyak bangun palsu. Dipercayai bahwa panggilan sem_timedwait () mengkonsumsi sinyal CV yang seharusnya tidak.
Memperbaiki kebocoran memori di ptw32_threaddestroy () untuk utas implisit.
Memperbaiki potensi kebuntuan di pthread_cond_destroy (). Kebuntuan dapat terjadi untuk CVS yang dinyatakan secara statis (pthread_cond_initializer), ketika satu utas berusaha untuk menghancurkan variabel kondisi sementara yang lain berusaha untuk menginisialisasi secara dinamis.
Sebelumnya, jika tidak ditentukan, gaya pembersihan ditentukan secara otomatis dari kompiler/bahasa, dan salah satu dari yang berikut ini didefinisikan sesuai:
PTW32_CLEANUP_SEH MSVC only
PTW32_CLEANUP_CXX C++, including MSVC++, GNU G++
PTW32_CLEANUP_C C, including GNU GCC, not MSVC
Definisasi ini menentukan gaya pembersihan (lihat pthread.h) dan, yang paling penting, cara pembatalan dan keluar utas (melalui pthread_exit) dilakukan (lihat ptw32_throw () rutin di private.c).
Singkatnya, versi pengecualian perpustakaan melempar pengecualian ketika utas dibatalkan atau keluar (melalui pthread_exit ()), yang ditangkap oleh pawang dalam rutin startup utas, sehingga tumpukan yang benar terjadi di mana pun di mana -mana Thread adalah saat dibatalkan atau keluar melalui pthread_exit ().
Dalam snapshot ini dan di masa mendatang, kecuali Build secara eksplisit mendefinisikan (misalnya melalui opsi kompiler) ptw32_cleanup_seh, ptw32_cleanup_cxx, atau ptw32_cleanup_c, maka build sekarang selalu default untuk pembersihan gaya ptw32_cleanup_c. Gaya ini menggunakan setJmp/longJMP dalam implementasi pembatalan dan pthread_exit, dan karenanya tidak akan melakukan stack lepas bahkan ketika ditautkan ke aplikasi yang memilikinya (misalnya aplikasi C ++). Ini untuk konsistensi dengan implementasi utas POSIX unix komersial terkini. Tru64 Compaq mungkin merupakan pengecualian (tidak ada permainan kata -kata) dan kemungkinan tren di masa depan.
Meskipun tidak didokumentasikan sebelumnya, masih perlu untuk membangun aplikasi Anda menggunakan PTW32_Cleanup_* yang sama yang ditentukan seperti yang digunakan untuk versi perpustakaan yang Anda tautkan, sehingga bagian pthread.h yang benar disertakan. Artinya, kemungkinan definisi memerlukan versi perpustakaan berikut:
PTW32_CLEANUP_SEH pthreadVSE.dll
PTW32_CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll
PTW32_CLEANUP_C pthreadVC.dll or pthreadGC.dll
Misalnya terlepas dari apakah aplikasi Anda c atau c ++, jika Anda menautkan dengan pthreadvc.lib atau libpThreadgc.a, maka Anda harus mendefinisikan ptw32_cleanup_c.
Intinya semua ini adalah: jika Anda belum mendefinisikan salah satu dari ini secara eksplisit, maka default seperti yang dijelaskan di bagian atas bagian ini sedang digunakan.
Ini sekarang berubah, seperti yang telah dijelaskan di atas, tetapi untuk mencoba membuat ini lebih jelas, inilah contohnya:
Jika Anda membangun aplikasi Anda dengan MSVC ++ IE menggunakan pengecualian C ++ dan tidak secara eksplisit mendefinisikan salah satu dari PTW32_CleanUp_*, maka PTW32_Cleanup_c ++ secara otomatis didefinisikan untuk Anda di pthread.h. Anda seharusnya menghubungkan dengan pthreadvce.dll, yang tidak menumpuk.
Jika Anda sekarang membangun aplikasi seperti sebelumnya, pthread.h sekarang secara otomatis akan mengatur ptw32_cleanup_c sebagai gaya default, dan Anda harus menautkan dengan pthreadvc.dll. Stack Unsuling sekarang tidak akan terjadi ketika utas dibatalkan, atau utas memanggil pthread_exit ().
Aplikasi Anda sekarang kemungkinan besar akan berperilaku berbeda terhadap versi sebelumnya, dan dengan cara yang tidak jelas. Kemungkinan besar adalah bahwa benda -benda yang dipakai secara lokal mungkin tidak dihancurkan atau dibersihkan setelah utas dibatalkan.
Jika Anda menginginkan perilaku yang sama seperti sebelumnya, maka Anda sekarang harus mendefinisikan ptw32_cleanup_c ++ secara eksplisit menggunakan opsi kompiler dan tautan dengan pthreadvce.dll seperti yang Anda lakukan sebelumnya.
Mengapa kita membuat gaya default kurang ramah-pengecualian? Karena tidak ada implementasi utas POSIX UNIX komersial memungkinkan Anda memilih untuk memiliki tumpukan yang tidak terkelupas. Oleh karena itu, menyediakannya di pthread-win32 sebagai default berbahaya. Kami masih memberikan pilihan tetapi kecuali jika Anda secara sadar memilih untuk melakukan sebaliknya, aplikasi pthreads Anda sekarang akan berjalan atau macet dengan cara yang sama terlepas dari platform utas yang Anda gunakan. Atau setidaknya ini adalah harapan.
Mengapa tidak menghapus versi pengecualian perpustakaan sama sekali? Ada beberapa alasan:
Untuk memungkinkan ukuran gambar yang lebih kecil dihasilkan untuk aplikasi yang menautkan secara statis dengan perpustakaan, sebagian besar rutin telah dipisahkan menjadi file kode sumber individual.
Ini sedang dilakukan sedemikian rupa sehingga kompatibel ke belakang. File sumber lama digunakan kembali untuk mengumpulkan file rutin individu ke dalam unit terjemahan yang lebih besar (melalui sekelompok #includes) sehingga kompiler masih dapat mengoptimalkan sedapat mungkin, misalnya melalui inlining, yang hanya dapat dilakukan dalam unit terjemahan yang sama.
Dimungkinkan juga untuk membangun seluruh perpustakaan dengan menyusun file tunggal bernama "pthread.c", yang hanya #termasuk semua file sumber jemaat sekunder. Kompiler mungkin dapat menggunakan ini untuk melakukan lebih banyak rutinitas.
Meskipun kompiler GNU mampu menghasilkan perpustakaan dengan pemisahan yang diperlukan (sakelar -fungsi -seegment), AFAIK, MSVC dan kompiler lainnya tidak memiliki fitur ini.
Akhirnya, karena saya menggunakan Makefiles dan kompilasi baris perintah, saya tidak tahu apa yang mungkin terjadi reorganisasi ini di antara pengguna file proyek IDE. Anda harus dapat terus menggunakan file proyek Anda yang ada tanpa modifikasi.
pthread_num_processors_np ():
Mengembalikan jumlah prosesor dalam sistem yang tersedia untuk proses, sebagaimana ditentukan dari mask afinitas prosesor.
pthread_timechange_handler_np ():
Untuk meningkatkan toleransi terhadap perubahan jam kerja operator atau layanan waktu.
Rutin ini dapat dipanggil dengan aplikasi ketika menerima pesan WM_TIMECHANGE dari sistem. Saat ini ia menyiarkan semua variabel kondisi sehingga utas yang menunggu dapat bangun dan mengevaluasi kembali kondisi mereka dan memulai kembali penantian waktu mereka jika diperlukan.
Karena Win95 tidak memberikannya, perpustakaan sekarang berisi rutin interlockedcompareexchange () sendiri, yang digunakan kapan pun Windows tidak menyediakannya. InterlockedCompareExchange () digunakan untuk mengimplementasikan spinlock dan hambatan, dan juga pada mutex. Rutin ini bergantung pada instruksi mesin CMPXCHG yang tidak tersedia di I386 CPU. Perpustakaan ini (dari Snapshot 20010712 dan seterusnya) karena itu tidak lagi didukung pada platform prosesor i386.
Hanya untuk portabilitas kode sumber - rwlocks belum dapat diproses dibagikan.
pthread_rwlockattr_init()
pthread_rwlockattr_destroy()
pthread_rwlockattr_setpshared()
pthread_rwlockattr_getpshared()
Sebagaimana didefinisikan dalam standar POSIX baru, dan Single Unix Spec Versi 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()
[Belum untuk G ++]
Ini dilakukan untuk mencegah konflik.
Pegangan, DWORD, dan NULL untuk sementara didefinisikan dalam pthread.h jika belum.
Tidak hanya untuk menghindari kebutuhan untuk file pthread.def, tetapi untuk meningkatkan kinerja. Rupanya, mendeklarasikan fungsi dengan Dllimport menghasilkan panggilan langsung ke fungsi dan menghindari overhead panggilan fungsi rintisan.
This could be made transparent to applications by replacing the macros that define the current C++ and SEH versions of pthread_cleanup_push/pop with the C version, but AFAIK cleanup handlers would not then run in the correct sequence with destructors and exception cleanup handlers when an exception occurs .
Pembatalan sekali dimulai di utas tidak dapat secara tidak sengaja dibatalkan ganda. Artinya, begitu utas dimulai, pembatalannya, pembatalan dinonaktifkan dan permintaan pembatalan berikutnya akan mengembalikan kesalahan (ESRCH).
ERRNO: Petunjuk kompiler yang salah menyebabkan versi errno lokal digunakan sebagai ganti win32 errno. Kedua contoh ini aman-utas tetapi aplikasi memeriksa errno setelah panggilan pthreads-win32 akan salah. Memperbaiki ini juga memperbaiki opsi kompiler yang buruk di testSuite ( /mt seharusnya /md) yang diperlukan untuk menautkan dengan pustaka msvcrt.lib yang benar.
Untuk ditambahkan
Untuk ditambahkan
Baru:
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.
Bug diperbaiki:
MSVC++ C++ exception handling.
Beberapa tes baru telah ditambahkan.
Baru:
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
Bug diperbaiki:
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)
Beberapa tes baru telah ditambahkan.
Bug diperbaiki:
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).
Beberapa perbaikan kompatibilitas ditambahkan, misalnya.
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)
Beberapa tes baru telah ditambahkan.
Perbaikan Bug - Pembatalan utas yang menunggu pada variabel kondisi sekarang berfungsi dengan baik (Lorin Hochstein dan Peter Slacik)
Memperbaiki pembersihan tumpukan pengecualian jika memanggil pthread_exit ()
Fixed Bugs dalam Variabel Kondisi - (Peter Slacik): - Pemeriksaan Perselisihan Tambahan - Sesuaikan jumlah utas menunggu dengan benar setelah batas waktu condvar waktunya.
Beberapa bug kecil telah diperbaiki. Lihat file Changelog untuk detailnya.
Beberapa fungsi POSIX 1B sekarang disertakan tetapi ony mengembalikan kesalahan (enosys) jika dipanggil. Mereka adalah:
sem_open
sem_close
sem_unlink
sem_getvalue
Beberapa fungsi POSIX 1B yang didukung secara internal sekarang tersedia sebagai fungsi yang diekspor:
sem_init
sem_destroy
sem_wait
sem_trywait
sem_post
sched_yield
sched_get_priority_min
sched_get_priority_max
Beberapa bug kecil telah diperbaiki. Lihat file Changelog untuk detailnya.
Rilis awal.