Fork combiné pthread-win32
de RedFox20 + Oktonion + WinBuild
Modifications de PThread https://github.com/WinBuilds/pthread-win32 :
Il s'agit d'un fork de la version 2.10.0.0 du package pthreads-win32. L'ABI de cette fourche est différent de l'original.
Modifications effectuées :
Le type du compteur de réutilisation dans ptw32_handle_t
a été modifié de int
à size_t
afin de faciliter les serveurs de longue durée.
Suppression des éléments inutilisés de pthread_once_t
Cette bibliothèque est testée fréquemment avec nos autres projets Visual Studio 2022.
En général, j'utilise (et j'ai utilisé) les fichiers de projet MSVC20xx pour mon travail. Les Makefiles ont été utilisés beaucoup moins fréquemment et peuvent être obsolètes.
Veuillez noter le message de validation d4b0ef6b : bien que le projet MSVC2022/2019 ait été configuré pour s'adapter à mes paramètres internes, il se peut qu'il ne convienne pas aux vôtres.
Vous pouvez, bien sûr, toujours modifier les paramètres à la main, mais lorsque vous devez le faire pour de nombreux fichiers de projet vcxproj
, la création d'un script pour la tâche peut être la solution. Voir update-vcxproj.js
et patch-vcxproj.js
pour des exemples de scripts qui font ce genre de chose. Je les utilise pour m'assurer que tous mes projets C/C++ ont exactement les mêmes paramètres de construction afin de ne pas avoir de mauvaises surprises au moment de l'exécution, car certains projets ont décidé de construire avec des bibliothèques d'exécution Debug/Release Static/DLL très légèrement différentes, etc.etc. : les millions de façons d'obtenir ?? par votre système de build dans un environnement Windows. Amusant! ?
(2021-12-17)
Il s'agit d'une micro-version contenant principalement des correctifs administratifs.
mkdir b && cd b && cmake -G "Visual Studio 16 2019" ..
: OK. Cela signifie que plusieurs bugs cachés ont été corrigés et nous avons inclus une solution de contournement pour les conneries de CMake (je n'aime toujours pas cet outil) lorsque les sources C doivent être compilées de manière conditionnelle en C++ (voir aussi pthread-EH.cpp et pthread-JMP.c : deux nouveaux fichiers sources du wrapper). Il s'agit d'une micro-version contenant principalement des correctifs administratifs.
Les versions MSVC et MinGW64 ont été testées sur l'architecture SMP (Intel x64 Hex Core) en complétant la suite de tests incluse, ainsi que les tests de contrainte et au banc.
Assurez-vous d'exécuter vos builds avec la suite de tests. Si vous constatez des échecs, veuillez réfléchir à la manière dont vos chaînes d'outils pourraient contribuer à l'échec. Consultez le fichier README pour des descriptions plus détaillées des chaînes d'outils et des systèmes de test que nous avons utilisés pour réussir les tests.
Nous recommandons MinGW64 plutôt que MinGW pour les versions GNU CC 64 et 32 bits uniquement, car la gestion des exceptions MinGW DWARF2 avec les versions C++ provoque des problèmes d'annulation de thread.
MinGW64 inclut également sa propre implémentation native de pthreads, que vous préférerez peut-être utiliser. Si vous souhaitez créer notre bibliothèque, vous devrez sélectionner l'option de threads natifs Win32 au moment de l'installation. Nous vous recommandons également de sélectionner la méthode de gestion des exceptions SJLJ pour les builds MinGW64-w32. Pour les builds MinGW64-w64, la méthode de gestion des exceptions SJLJ ou SEH devrait fonctionner.
(2018-08-08)
Notez qu'il s'agit d'une nouvelle version majeure. L'incrément de version majeur introduit deux modifications ABI ainsi que d'autres modifications de nom qui nécessiteront une recompilation des applications de liaison et éventuellement des modifications textuelles des références de macro au moment de la compilation dans les fichiers de configuration et sources, par exemple les modifications de PTW32_* en PTW32_ , ptw32_ en ptw32_*, etc. .
Avec l'accord de tous les contributeurs importants, pthreads-win32 / pthreads4w version 3, à l'exception de quatre fichiers, est publié selon les termes de la licence Apache v2.0. L'APLv2 est compatible avec les licences GPLv3 et LGPLv3 et ce code peut donc continuer à être légalement inclus dans les projets GPLv3 et LGPLv3.
Un contributeur important et pertinent a été défini comme celui qui a contribué au code original qui implémente une fonctionnalité présente dans les versions ultérieures. Cela exclut plusieurs contributeurs qui ont contribué au code devenu obsolète ou qui ont fourni des correctifs qui corrigent des bogues, réorganisent le code à des fins esthétiques ou pratiques ou améliorent les processus de construction. Cette distinction était nécessaire pour avancer dans l’hypothèse où tous les contributeurs ne seraient pas joignables. Tous les contributeurs sont répertoriés dans le fichier CONTRIBUTEURS.
Les quatre fichiers qui resteront LGPL mais passeront à la v3 sont des fichiers utilisés pour configurer les builds de l'environnement GNU :
aclocal.m4
configure.ac
GNUmakefile.in
tests/GNUmakefile.in
Les contributeurs qui ont demandé ce changement ou qui l'ont accepté lors de leur consultation sont :
Les versions pthreads-win32 / pthreads4w version 2 resteront LGPL mais les versions 2.11 et ultérieures seront publiées sous la v3 de cette licence afin que tout ajout au code pthreads4w version 3 rétroporté vers la v2 ne pollue pas ce code.
Certaines modifications apportées à partir du 26/02/2011 peuvent ne pas être compatibles avec les systèmes antérieurs à Windows 2000.
Les nouvelles corrections de bugs dans toutes les versions depuis la 2.8.0 n'ont PAS été appliquées à la série 1.xx.
Les versions MSVC, MinGW et MinGW64 ont été testées sur l'architecture SMP (Intel x64 Hex Core) en complétant la suite de tests incluse, ainsi que les tests de contrainte et au banc.
Assurez-vous d'exécuter vos builds avec la suite de tests. Si vous constatez des échecs, veuillez réfléchir à la manière dont vos chaînes d'outils pourraient contribuer à l'échec. Consultez le fichier README pour des descriptions plus détaillées des chaînes d'outils et des systèmes de test que nous avons utilisés pour réussir les tests.
Nous recommandons MinGW64 plutôt que MinGW pour les versions GNU CC 64 et 32 bits uniquement, car la gestion des exceptions MinGW DWARF2 avec les versions C++ provoque des problèmes d'annulation de thread.
MinGW64 inclut également sa propre implémentation native de pthreads, que vous préférerez peut-être utiliser. Si vous souhaitez créer notre bibliothèque, vous devrez sélectionner l'option de threads natifs Win32 au moment de l'installation. Nous vous recommandons également de sélectionner la méthode de gestion des exceptions SJLJ pour les builds MinGW64-w32. Pour les builds MinGW64-w64, la méthode de gestion des exceptions SJLJ ou SEH devrait fonctionner.
Hormis ce qui suit, cette version est équivalente en fonctionnalités à la v2.11.0.
Cette version introduit une modification de pthread_t et pthread_once_t qui affectera les applications liées à la bibliothèque.
pthread_t : reste une structure mais étend le compteur de réutilisation de 32 bits à 64 bits. Sur les machines 64 bits, la taille globale de l'objet n'augmentera pas, nous utilisons simplement 4 octets de remplissage à bon escient, réduisant ainsi le risque que le compteur puisse se retourner dans des applications à très longue exécution de petit à effectivement zéro. Le compteur de réutilisation 64 bits étend la durée d'exécution sans risque de plusieurs mois (en supposant une durée de vie moyenne des threads de 1 ms) à des siècles (en supposant une durée de vie moyenne des threads de 1 ns).
pthread_once_t : supprime deux éléments obsolètes depuis longtemps et réduit leur taille.
(2018-08-08)
Les nouvelles corrections de bugs dans toutes les versions depuis la 2.8.0 n'ont PAS été appliquées à la série 1.xx.
Certaines modifications apportées à partir du 26/02/2011 peuvent ne pas être compatibles avec les systèmes antérieurs à Windows 2000.
pthreads-win32 / pthreads4w version 2.11 et toutes les futures versions 2.x seront publiées sous la Lesser GNU Public License version 3 (LGPLv3).
La prochaine version majeure de ce logiciel (version 3) sera publiée sous la licence Apache version 2.0 (ALv2). La sortie de la version 2.11 sous LGPLv3 permettra aux modifications apportées à la version 3 de ce logiciel d'être rétroportées vers la version 2 à l'avenir. De plus, tous les projets GPL utilisant actuellement cette bibliothèque pourront continuer à utiliser la version 2 ou 3 de ce code dans leurs projets.
Pour plus d'informations, veuillez consulter : https://www.apache.org/licenses/GPL-compatibility.html
Afin de rester cohérent avec ce changement, les modifications de cette bibliothèque ne seront désormais acceptées que par rapport à la version 3 de ce logiciel selon les termes de l'ALv2. Ils seront ensuite, le cas échéant, rétroportés vers la version 2.
Nous espérons publier la version 3 en même temps que la version 2.11.
Cette version a été testée sur l'architecture SMP (Intel x64 Hex Core) en complétant la suite de tests incluse, ainsi que les tests de stress et de banc.
Assurez-vous d'exécuter vos builds avec la suite de tests. Si vous constatez des échecs, veuillez réfléchir à la manière dont vos chaînes d'outils pourraient contribuer à l'échec. Consultez le fichier README pour des descriptions plus détaillées des chaînes d'outils et des systèmes de test que nous avons utilisés pour réussir les tests. Nous recommandons MinGW64 plutôt que MinGW32 pour les versions GNU CC 64 et 32 bits. MinGW64 inclut également sa propre implémentation indépendante de pthreads, que vous préférerez peut-être utiliser.
Pour les versions de chaîne d'outils Microsoft : (1) La liaison statique nécessite que cette bibliothèque et toutes les bibliothèques ou applications de liaison soient compilées de manière cohérente avec /MT.
(2) Les bibliothèques statiques ont été renommées libpthreadV*.lib pour les différencier des bibliothèques d'importation de DLL pthreadV*.lib.
(3) Si vous utilisez une liaison mixte, par exemple en liant la version statique /MT de la bibliothèque à une application liée avec /MD, vous pourrez peut-être utiliser GetLastError() pour interroger le code d'erreur car la bibliothèque définit les deux errno (via _set_errno ()) et SetLastError().
Supprimez la tentative de définition de PTW32_USES_SEPARATE_CRT dans les en-têtes, ce qui peut entraîner des résultats inattendus. Dans certaines situations, un utilisateur peut souhaiter le définir explicitement dans son environnement pour invoquer ses effets, soit lors de la création de la bibliothèque, soit d'une application, soit les deux. Voir README.NONPORTABLE. -Ross Johnson
La bibliothèque devrait être plus fiable dans des scénarios entièrement liés statiquement. Remarque : nous avons supprimé le code PIMAGE_TLS_CALLBACK et sommes revenus à la méthode précédente qui semble plus fiable dans toutes les éditions du compilateur.
Diverses corrections à GNUmakefile. Bien que ce fichier ait été supprimé, par souci d'exhaustivité, les modifications ont été enregistrées en tant que validations dans le référentiel.
MinGW64-w64 définit pid_t comme __int64. sched.h reflète maintenant cela.
Plusieurs tests qui échouaient sur les machines sous charge ont été corrigés. D'autres tests qui utilisaient des mécanismes bruts similaires pour synchroniser les threads (ce sont des tests unitaires) ont appliqué les mêmes améliorations : semaphore5.c reconnaît que sem_destroy peut légitimement renvoyer EBUSY ; mutex6*.c, mutex7*.c et mutex8*.c ont tous remplacé un seul Sleep() par une boucle d'interrogation.
(2016-09-18)
Les nouvelles corrections de bugs dans toutes les versions depuis la 2.8.0 n'ont PAS été appliquées à la série 1.xx.
Certaines modifications apportées à partir du 26/02/2011 peuvent ne pas être compatibles avec les systèmes antérieurs à Windows 2000.
Cette version a été testée sur l'architecture SMP (Intel x64 Hex Core) en complétant la suite de tests incluse, ainsi que les tests de stress et de banc.
Assurez-vous d'exécuter vos builds avec la suite de tests. Si vous constatez des échecs, veuillez réfléchir à la manière dont vos chaînes d'outils pourraient contribuer à l'échec. Consultez le fichier README pour des descriptions plus détaillées des chaînes d'outils et des systèmes de test que nous avons utilisés pour réussir les tests. Nous recommandons MinGW64 plutôt que MinGW32 pour les versions GNU CC 64 et 32 bits. MinGW64 inclut également sa propre implémentation indépendante de pthreads, que vous préférerez peut-être utiliser.
Nouvelles routines : 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()
Les environnements de compilateur GNU (MinGW32 et MinGW64) ont désormais la possibilité d'utiliser autoconf pour configurer automatiquement la build.
Builds : de nouvelles cibles makefile ont été ajoutées et les cibles existantes modifiées ou supprimées. Par exemple, vise à créer et tester toutes les configurations possibles des bibliothèques DLL et statiques.
Les versions du compilateur GNU utilisent désormais explicitement la compatibilité des normes ISO C et C++ 2011. Si votre compilateur GNU ne prend pas en charge cela, envisagez de le mettre à jour. La configuration automatique est désormais possible via le script « configurer ». Le script doit être généré en utilisant autoconf - voir le fichier README. Merci à Keith Marshall du projet MinGW.
Liaison statique : la fonctionnalité autostatique a été déplacée vers dll.c et étendue afin que les builds utilisant MSVC8 et versions ultérieures ne nécessitent plus que les applications appellent pthread_win32_thread_detach_np(). Autrement dit, toutes les fonctionnalités de DllMain sont désormais automatiques pour la liaison statique pour ces versions.
Certaines cibles de liaison statique nmake ont été désactivées : en raison d'un problème avec le comportement de TLS, les cibles nmake V*-small-static* dans Makefile ont été désactivées. Le problème est exposé par tests/semaphore3.c où l'appel pthread_self() à l'intérieur du thread ne parvient pas à renvoyer le handle de thread POSIX correct mais renvoie à la place un nouveau handle de thread POSIX "implicite". Les handles pthread implicites ont un statut de thread détaché, ce qui fait que l'appel pthread_detach() à l'intérieur du thread renvoie EINVAL. Les cibles V*-static* ne semblent pas affectées. La principale différence est que ces derniers sont générés à partir d’une seule unité de compilation.
La liaison statique de petits fichiers objets fonctionne désormais (MinGW). Le code autostatique est requis mais rien ne faisait explicitement référence à ce code et était donc optimisé.
sem_getvalue() pourrait renvoyer la valeur errno au lieu de définir errno et de renvoyer -1.
Les valeurs Errno étaient perdues si la bibliothèque était liée statiquement à la bibliothèque d'exécution, ce qui signifiait également que l'application utilisait une instance d'exécution distincte. C'est toujours le cas, sauf qu'un commutateur de build a été ajouté qui permet d'incorporer un statut d'erreur plus robuste, c'est-à-dire permettre de récupérer le code de retour via GetLastError().
Identifié la cause des échecs importants autour de l'annulation et de pthread_exit() pour la configuration de build GCE (GNU C++) comme provenant de Mingw32. Je ne sais pas si cela est général ou simplement lors de la création de bibliothèques et d'applications 32 bits fonctionnant sur des systèmes 64 bits. Ces échecs ne se produisent pas avec les versions Mingw64 32 bits (GCC construites avec multilib activé) exécutées sur des systèmes 64 bits.
Le bogue pthread_key_delete() introduit dans la version 2.9.x provoquait l'échec de cette routine d'une manière que la suite de tests ne détectait pas. Un nouveau test a été ajouté pour confirmer que cette routine se comporte correctement, notamment lorsque les clés avec des destructeurs sont supprimées avant la sortie des threads.
pthread_win32_process_attach_np() corrige un échec/sécurité potentiel autour de la recherche et du chargement de QUSEREX.DLL.
_POSIX_THREAD_ATTR_STACKADDR est désormais égal à -1 dans pthread.h. En conséquence, pthread_attr_setstackaddr() renvoie désormais ENOSYS. Auparavant, la valeur était stockée et pouvait être récupérée, mais elle était autrement inutilisée. pthread_attr_getstackaddr() renvoie ENOSYS en conséquence.
Correction d'une fuite de mémoire potentielle dans pthread_mutex_init(). La fuite ne se produirait que si l'initialisation du mutex échouait (extrêmement rare, voire jamais).
Correction de délais d'attente inférieurs à la milliseconde, qui entraînaient une attente occupée de la bibliothèque.
Correction d'une condition de concurrence critique et d'un crash dans les verrous MCS. Le code de gestion de la file d'attente du serveur dans ptw32_mcs_lock_acquire était en concurrence avec le code de gestion de la file d'attente dans ptw32_mcs_lock_release et provoquait une erreur de segmentation.
(2012-05-27)
Les nouvelles corrections de bogues dans cette version depuis la version 2.8.0 n'ont PAS été appliquées à la série 1.xx.
Cette version remplace une version 2.9.0 extrêmement brève et ajoute quelques modifications de dernière minute non liées au code pour intégrer de meilleures propriétés descriptives dans les DLL afin d'indiquer l'architecture cible et les environnements de construction.
Certaines modifications apportées à CVS après le 26/02/2011 peuvent ne pas être compatibles avec les systèmes antérieurs à Windows 2000.
L'utilisation d'une version autre que "C" de la bibliothèque est désormais déconseillée. Autrement dit, la version « C++ » échoue à certains tests et ne fournit aucune fonctionnalité supplémentaire.
Cette version a été testée sur l'architecture SMP (Intel x64 Hex Core) en complétant la suite de tests, les tests de contrainte et les tests au banc inclus.
Les propriétés de la DLL incluent désormais correctement l'architecture cible, c'est-à-dire faites un clic droit sur le fichier pthreadVC2.dll dans l'explorateur et choisissez l'onglet Détails pour afficher le compilateur et l'architecture dans le champ de description, par exemple "MS C x64" ou "MS C x86".
La dépendance à la bibliothèque winsock est désormais discrétionnaire via #define RETAIN_WSALASTERROR
dans config.h. Il n'est pas défini par défaut à moins que WINCE ne soit défini (car je (RJ) ne suis pas sûr de la dépendance).
(Builds MSC et GNU) La bibliothèque liée statiquement s'initialise et nettoie désormais automatiquement au démarrage/à la sortie du programme, c'est-à-dire que les applications liées statiquement n'ont pas besoin d'appeler explicitement les routines pthread_win32_process_attach_np() et pthread_win32_process_detach_np(). La routine par thread pthread_win32_thread_detach_np() est également appelée à la sortie du programme pour nettoyer les ressources POSIX acquises par le thread natif principal de Windows, si je (RJ) comprends correctement le processus. D'autres threads natifs Windows qui appellent des routines API POSIX peuvent devoir appeler la routine de détachement de thread à la sortie du thread si l'application dépend de ressources POSIX récupérées ou de l'exécution de destructeurs POSIX TSD (TLS). Voir README.NONPORTABLE pour les descriptions de ces routines.
Des mutex robustes sont implémentés dans la portée PROCESS_PRIVATE. NOTEZ que les fonctions pthread_mutex_* peuvent renvoyer des codes d'erreur différents pour les mutex robustes qu'ils ne le feraient autrement dans une utilisation normale, par exemple pthread_mutex_unlock est requis pour vérifier la propriété de tous les types de mutex lorsque le mutex est robuste, alors que cela ne se produit pas pour les non-mutex "normaux". type mutex robuste.
pthread_getunique_np est implémenté pour la compatibilité au niveau source avec certaines autres implémentations. Cette routine renvoie un numéro de séquence de 64 bits associé de manière unique à un thread. Il peut être utilisé par les applications pour commander ou hacher des descripteurs de thread POSIX.
Beaucoup plus de changements pour les systèmes 64 bits.
Diverses modifications et correctifs pour construire et tester pour WinCE.
Correction de pthread_cond_destroy() - ne devrait pas être un point d'annulation. Autres problèmes de construction mineurs résolus.
Supprimez la condition de blocage potentielle de pthread_cond_destroy().
Diverses modifications à construire et tester pour Win64.
Divers correctifs de la DLL d'assistance à l'annulation asynchrone QueueUserAPCEx (il s'agit d'un téléchargement séparé) et nettoyages de code pthreads.
Suppression de la référence potentielle de pointeur NULL.
Suppression de l'exigence selon laquelle les applications limitent le nombre de threads appelant pthread_barrier_wait au seul nombre de barrières. Également réduit le conflit entre barrière_wait et barrière_destroy. Ce changement aura légèrement ralenti les barrières mais divisera par deux le nombre de sémaphores consommés par barrière à un.
Correction d'une fuite de handle dans sched_[gs]etscheduler.
Suppression de toutes les macros de compatibilité des fonctions réentrantes POSIX de pthread.h. Certains n’étaient tout simplement pas sémantiquement corrects.
Les threads ne tentent plus de transmettre les exceptions non interceptées hors de la portée du thread (builds C++ et SEH uniquement). Les exceptions non interceptées entraînent désormais la fermeture du thread avec le code retour PTHREAD_CANCELED.
Beaucoup de correctifs de casting en particulier pour x64, correctifs de verrouillage et refonte pour x64.
La dépendance à la bibliothèque winsock est désormais discrétionnaire via #define RETAIN_WSALASTERROR
dans config.h. Il n'est pas défini par défaut à moins que WINCE ne soit défini (car RJ n'est pas sûr de la dépendance).
Plusieurs mutex POSIX statiques utilisés pour la gestion interne ont été remplacés par des verrous basés sur des files d'attente MCS pour réduire la consommation de ressources, en particulier l'utilisation d'objets Win32.
Pour des raisons de sécurité, le QuserEx.dll, s'il est utilisé, doit maintenant être installé dans le dossier Système Windows.
robuste[1-5].c - Mutex robustes séquence1.c - numéros de séquence uniques par thread
Tous les tests mutex*.c, le cas échéant, ont été modifiés pour tester également des mutex robustes dans les mêmes conditions. Ajout de benchtests mutex robustes à benchtest*.c chaque fois que cela est approprié.
(2006-12-22)
Les nouvelles corrections de bogues dans cette version depuis la version 2.7.0 n'ont pas été appliquées à la série version 1.xx. Il est probablement temps d'abandonner la version 1.
Cette version n'a pas encore été testée sur les architectures SMP. Tous les tests sont effectués sur un système monoprocesseur.
Sem_destroy pourrait renvoyer EBUSY même si aucun thread n'attendait sur le sémaphore. D'autres courses autour des structures de sémaphore invalidantes (en interne) ont également été supprimées.
semaphore5.c - teste le correctif de bogue mentionné ci-dessus.
(2005-06-04)
Toutes les nouvelles fonctionnalités de cette version ont été rétroportées dans la version 1.11.0, y compris l'incorporation de verrous MCS dans pthread_once. Cependant, les versions 1 et 2 restent incompatibles même si elles sont désormais identiques en termes de performances et de fonctionnalités.
Cette version a été testée (avec succès la suite de tests) sur des systèmes monoprocesseurs et multiprocesseurs.
Pthread_once a été réimplémenté pour supprimer l'augmentation des priorités et autres complexités afin d'améliorer la robustesse. Les courses pour les handles Win32 qui ne sont pas uniques au recyclage ont été supprimées. La forme générale de pthread_once est maintenant la même que celle suggérée précédemment par Alexander Terekhov, mais au lieu du « mutex nommé », un verrou basé sur une file d'attente a été implémenté qui possède les propriétés requises d'auto-initialisation et de destruction dynamiques. Cette serrure est également efficace. L'ABI n'est pas affecté dans la mesure où la taille de pthread_once_t n'a pas changé et PTHREAD_ONCE_INIT n'a pas changé, cependant, les applications qui jettent un coup d'œil à l'intérieur de pthread_once_t, qui est censé être opaque, se briseront.
(2005-05-19)
Toutes les corrections de bugs et les nouvelles fonctionnalités de cette version ont été rétroportées dans la version 1.10.0.
Cette version a été testée (avec succès la suite de tests) sur des systèmes monoprocesseurs et multiprocesseurs. Merci à Tim Theisen de TomoTherapy pour avoir exécuté de manière exhaustive les tests MP et pour avoir fourni des observations et des données cruciales lorsque des défauts sont détectés.
(2005-05-09)
Le package comprend désormais un ensemble de documentation de référence composé de pages de manuel de style Unix au format HTML qui ont été éditées pour plus de cohérence avec pthreads-win32. L'ensemble peut également être lu en ligne sur : http://sources.redhat.com/pthreads-win32/manual/index.html
Merci encore à Tim Theisen pour avoir exécuté la version préliminaire de la suite de tests sur un système MP.
Toutes les corrections de bugs et les nouvelles fonctionnalités de cette version ont été rétroportées dans la version 1.9.0.
L'implémentation modifiée évite le recours au HANDLE problématique et récupère la mémoire dès que la clé est supprimée OU que le thread se termine, selon la première éventualité.
Merci à Richard Hughes d'Aculab pour avoir identifié et localisé la fuite.
Les destructeurs de clés TSD sont désormais traités jusqu'à PTHREAD_DESTRUCTOR_ITERATIONS fois au lieu d'une seule. PTHREAD_DESTRUCTOR_ITERATIONS a été défini dans pthread.h depuis un certain temps mais n'est pas utilisé.
Correction d'une course comptable de sémaphore entre l'annulation sem_post/sem_post_multiple et sem_wait. Il s'agit du même problème qu'avec sem_timedwait qui a été résolu dans la dernière version.
sem_init, sem_post et sem_post_multiple vérifient désormais que le nombre de sémaphores ne dépasse jamais _POSIX_SEM_VALUE_MAX.
Bien que sigwait() ne soit rien de plus qu'une non-opération, cela devrait au moins être un point d'annulation pour être cohérent avec la norme.
stress1.c - tente d'exposer les problèmes dans la logique d'attente des variables de condition et du sémaphore. Ce test a été inspiré par l'exemple de code de test de Stephan Mueller utilisé pour identifier le bug sem_timedwait de la dernière version. Il ne fait pas partie de la suite de tests habituelle car son exécution peut prendre un certain temps. Pour l'exécuter : nmake clean VC-stress
tsd2.c - teste que les destructeurs de clés sont réexécutés si la valeur de la clé tsd n'est pas NULL après l'exécution de la routine du destructeur. Teste également que pthread_setspecial() et pthread_getspecial() peuvent être appelés à partir de destructeurs.
(2005-04-26)
Il n'est actuellement pas prévu de publier une version 3.0.0 pour résoudre les problèmes de pthread_once(). D'autres implémentations possibles de pthread_once seront toujours étudiées pour une éventuelle version future dans le but de réduire la complexité de l'implémentation actuelle.
Toutes les corrections de bugs et les nouvelles fonctionnalités de cette version ont été rétroportées pour la version 1.8.0.
Correction de la course pthread_once (échecs sur un système MP). Merci à Tim Theisen pour avoir effectué des tests préliminaires exhaustifs sur son système MP à l'aide d'une gamme de compilateurs : VC++ 6 VC++ 7.1 Intel C++ version 8.0 Tous les tests ont réussi. Quelques améliorations mineures de la vitesse ont également été apportées.
Correction d'une erreur de dépassement d'entier dans pthread_mutex_timedlock() - manquée lorsque sem_timedwait() a été corrigé dans la version 2.2.0. Cette routine ne renvoie plus ENOTSUP lorsque NEED_SEM est défini - elle est prise en charge (NEED_SEM n'est requis que pour les versions WinCE antérieures à 3.0).
Correction d'un bug de délai d'attente dans sem_timedwait().
Correction de plusieurs problèmes dans le code inclus conditionnellement NEED_SEM. Le code inclus NEED_SEM est fourni pour les systèmes qui n'implémentent pas les sémaphores W32, tels que WinCE avant la version 3.0. Une implémentation alternative des sémaphores POSIX est construite à l'aide d'événements W32 pour ces systèmes lorsque NEED_SEM est défini. Ce code a été complètement réécrit dans cette version pour réutiliser la plupart du code du sémaphore POSIX par défaut, et en particulier, pour implémenter toutes les routines sem_* prises en charge par pthreads-win32. Tim Theisen a également exécuté la suite de tests sur le code NEED_SEM sur son système MP. Tous les tests ont réussi.
La bibliothèque est désormais construite sans erreurs pour le compilateur Borland Builder 5.5.
pthread_once est trop compliqué - mais cela fonctionne dans la mesure où les tests peuvent le déterminer.
La version Borland de la DLL échoue à certains tests avec une exception de lecture de la mémoire. La cause n'est pas encore connue mais un bug du compilateur n'a pas été exclu.
(2005-04-12)
La version 1.7.0 est un rétroportage des fonctionnalités et des corrections de bugs nouvelles dans cette version. Voir les notes précédentes sous la version 2.0.0/Général.
(2005-04-04)
Ajout de cibles makefile pour créer des versions de liens statiques de la bibliothèque. MinGW et MSVC. Veuillez noter que cela n'implique aucun changement dans la licence LGPL, qui impose toujours des conditions spécifiques sur la distribution de logiciels liés statiquement à cette bibliothèque.
Il existe un bug connu dans pthread_once(). L'annulation de la routine init_routine expose à un problème potentiel de famine (c'est-à-dire de blocage) si un thread en attente a une priorité plus élevée que le thread initial. Ce problème sera corrigé dans la version 3.0.0 de la bibliothèque.
Correction d'une erreur de dépassement d'entier dans sem_timedwait(). Kévin Lussier
Correction des directives du préprocesseur pour les liaisons statiques. Dimitar Panayotov
(2005-03-16)
(2005-03-16)
Cette version représente un changement ABI et le nom de la version DLL est passé de 1 à 2, par exemple pthreadVC2.dll.
La version 1.4.0 rétro-porte la nouvelle fonctionnalité incluse dans cette version. Veuillez distribuer les DLL créées à partir de cette version avec les mises à jour des applications créées sur pthreads-win32 version 1.xx.
Le nom du package a changé, remplaçant la date de l'instantané par le numéro de version + des informations descriptives. Par exemple, cette version est "pthreads-win32-2-0-0-release".
Version 1.3.0
Version 1.2.0
Version 1.1.0
Version 1.0.0
Cet instantané corrige principalement le bug condvar introduit dans Snapshot-2004-11-03. Le versioning DLL a également été inclus pour permettre aux applications de vérifier les informations de version DLL compatibles Microsoft et de prolonger le système de dénomination de la DLL pour les modifications de l'API ABI et majeure (non compatible). Voir le fichier ReadMe pour plus de détails.
Une ressource de version de style Microsoft a été ajoutée à la DLL pour les applications qui souhaitent vérifier la compatibilité DLL au moment de l'exécution.
La dénomination de la DLL PTHREADS-WIN32 a été étendue pour permettre aux versions DLL incompatibles de coexister dans le même système de fichiers. Voir le fichier ReadMe pour plus de détails, mais brièvement: bien que les informations de version à l'intérieur de la DLL changent avec chaque version à partir de maintenant, les noms de version DLL ne changent que si la nouvelle DLL n'est pas compatible avec les applications plus anciennes.
Le schéma de versioning a été emprunté à GNU Libtool, et le schéma de dénomination de DLL est de Cygwin. À condition que les règles de numérotation de style Libtool soient honorées, le schéma de dénomination de DLL Cygwin garantit automatiquement que les modifications du nom de DLL sont minimes et que les applications ne chargeront pas une DLL incompatible Pthreads-Win32.
Ceux qui utilisent les DLL pré-construits constateront que les noms DLL / LIB ont un nouveau suffixe (1) dans cet instantané. Par exemple pthreadvc1.dll etc.
Certaines macros POSIX ont changé.
Ces modifications sont destinées à se conformer à la version 3 Unix Spécification UNIX, qui indique que, si elle est définie sur 0 (zéro) ou non, les applications peuvent utiliser SysConf () pour déterminer leurs valeurs au moment de l'exécution. Pthreads-win32 n'implémente pas sysconf ().
Les macros suivantes ne sont plus non définies, mais définies et définies sur -1 (non implémentées):
_POSIX_THREAD_ATTR_STACKADDR
_POSIX_THREAD_PRIO_INHERIT
_POSIX_THREAD_PRIO_PROTECT
_POSIX_THREAD_PROCESS_SHARED
Les macros suivantes sont définies et définies sur 200112l (implémentées):
_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
Les macros suivantes sont définies et définies sur des valeurs appropriées:
_POSIX_THREAD_THREADS_MAX
_POSIX_SEM_VALUE_MAX
_POSIX_SEM_NSEMS_MAX
PTHREAD_DESTRUCTOR_ITERATIONS
PTHREAD_KEYS_MAX
PTHREAD_STACK_MIN
PTHREAD_THREADS_MAX
Les DLL produites à partir de cet instantané ne peuvent pas être utilisées avec des applications plus anciennes sans recompiler l'application, en raison d'une modification de PTHREAD_T pour fournir des ID de fil POSIX uniques.
Bien que cet instantané passe la suite de tests prolongée, de nombreux changements sont assez importants et certaines applications peuvent montrer un comportement différent de celle précédemment, alors adoptez avec soin. Espérons que tout comportement modifié sera dû à la meilleure bibliothèque dans son travail, pas pire.
pthread_create () n'accepte plus null comme le thread Reference Arg. Un segfault (défaut d'accès à la mémoire) en résultera et aucun thread ne sera créé.
pthread_barrier_wait () n'agit plus comme un point d'annulation.
Correction de l'état de course potentiel dans pthread_once ()
Ajouté pour la compatibilité: pthread_recursive_mutex_initializer, pthread_errorcheck_mutex_initializer, pthread_recursive_mutex_initializer_np, pthread_errorcheck_mutex_initializer_np
Prise en charge initiale du compilateur Digital Mars
Mutexes plus rapides. Ceux-ci ont été réécrits à la suite d'un modèle fourni par Alexander Terekhov qui réduit les vérifications des espaces du noyau et élimine certaines sections critiques supplémentaires utilisées pour gérer une course entre l'expiration TimeMlock et le déverrouillage. Veuillez noter que les nouveaux mutex n'appliquent pas la planification FIFO absolu stricte des mutexes, mais toute acquisition de verrouillage hors commande devrait être très rare.
Semaphores plus rapides. Suivant un modèle similaire aux mutexes ci-dessus, ceux-ci ont été réécrits pour utiliser des vérifications d'espace préliminaires des utilisateurs.
SEM_GETVALUE () renvoie désormais le nombre de serveurs.
L'ID de fil POSIX a désormais des caractéristiques d'unicité beaucoup plus fortes. La bibliothèque garantit de ne pas réutiliser le même ID de thread pendant au moins 2 ^ (Wordsize) Destruction / Cycles de destruction / création.
Semaphore4.c: teste l'annulation du nouveau SEM_WAIT ().
Semaphore4t.c: De même pour SEM_TIMEDWAIT ().
RWLOCK8.C: Teste et fois les chemins d'exécution lents des verrous R / W, et les CV, les mutexes et les sémaphores sur lesquels ils sont construits.
Essayez d'ajouter Watcom à la liste des compilateurs qui peuvent créer la bibliothèque. Cela a échoué à la fin en raison de son errno non conscient du thread. La bibliothèque se construit mais la suite de test échoue. Voir readme.watcom pour plus de détails.
Remarque: Si vous n'utilisez pas d'annulation asynchrone dans votre application, ou si vous n'avez pas besoin d'annuler les threads qui sont bloqués sur les ressources système telles que les E / S de réseau, la annulation asynchrone non préemptive par défaut est probablement assez bonne. Cependant, Pthreads-WIN32 détecte automatiquement la disponibilité de ces composants au moment de l'exécution, vous n'avez donc pas besoin de reconstruire la bibliothèque à partir de la source si vous changez d'avis plus tard.
Tous les conseils disponibles dans les livres et ailleurs sur la indésirable de l'utilisation de l'annulation asynchrone dans toute application se trouve toujours, mais cette fonctionnalité est un ajout bienvenu en ce qui concerne la conformité de la bibliothèque à la norme POSIX.
Nettoyage de la gestion de la priorité du fil. En particulier, le réglage de la priorité du thread tente désormais de cartographier les valeurs Win32 non valides dans la plage renvoyée par sched_get_priority_min / max () sur des valeurs utiles. Voir Readme.Nonportable sous "Priorité du thread".
pthread_getschedParam () renvoie désormais la priorité donnée par l'appel le plus récent à pthread_setschedParam () ou établi par pthread_create (), comme l'exige la norme. Auparavant, pthread_getschedParam () a incorrectement renvoyé la priorité du thread en cours d'exécution au moment de l'appel, qui peut avoir été ajusté ou temporairement promu / démêlé.
sched_get_priority_min () et sched_get_priority_max () return -1 sur l'erreur et définir Errno. Auparavant, ils renvoyaient à tort la valeur d'erreur directement.
pthread_self () libérerait la poignée de thread POSIX implicite nouvellement créée si duplicateHandle a échoué au lieu de le recycler (très peu probable).
pthread_exit () n'était ni libérant ni recyclé le thread struct POSIX pour les threads POSIX implicites.
Depuis l'implémentation d'origine de John Bossom, la bibliothèque a permis aux threads initialisés non-Posix (threads Win32) d'appeler les routines PTHREADS-WIN32 et d'interagir donc avec les threads POSIX. Cela se fait en créant un ID de thread POSIX à la volée pour le thread Win32 qui, une fois créé, permet une interaction entièrement réciproque. Cela ne s'est pas étendu à l'annulation du fil (asynchrone ou différée). Maintenant c’est le cas.
Tout fil peut être annulé par n'importe quel autre thread (Win32 ou POSIX) si la valeur POSIX PTHREAD_T de l'ancien thread est connue. Ses destructeurs TSD et les gestionnaires de nettoyage POSIX seront exécutés avant que le thread ne sorte avec un code de sortie de PTHREAD_CANCELELED (récupéré avec GetExitCodeThread ()).
Cela permet à un thread Win32 d'appeler, par exemple, des routines POSIX CV de la même manière que les threads POSIX seraient / devraient, avec Pthread_Cond_Wait () les gestionnaires d'annulation et de nettoyage (PTHEAD_COND_WAIT () est un point d'annulation POSIX).
En ajoutant l'annulation, les threads Win32 devraient désormais être en mesure d'appeler toutes les routines de threads POSIX qui ont du sens, y compris les sémaphores, les mutexes, les variables de condition, les verrous de lecture / écriture, les barrières, les spinlocks, le TSD, la push / pop de nettoyage, l'annulation, le pthread_exit, la planification, etc. .
Notez que ces ID de thread POSIX «implicites» à la volée sont initialisés comme détachés (non joints) avec le type d'annulation différé. L'ID de thread POSIX sera créé automatiquement par toutes les routines POSIX qui ont besoin d'une poignée POSIX (sauf si la routine a besoin d'un PTHREAD_T en tant que paramètre bien sûr). Un thread Win32 peut découvrir son propre ID de thread POSIX en appelant pthread_self (), qui créera la poignée si nécessaire et renverra la valeur pthread_t.
Testez la nouvelle fonctionnalité ci-dessus.
Cet instantané corrige une certaine corruption accidentelle aux nouvelles sources de cas de test. Il n'y a aucune modification du code source de la bibliothèque.
Divers modifications à resserrer la vérification de l'ARG et à travailler avec des versions ultérieures de MingW32 et MSYSDTK.
pthread_getschedParam () etc, la vérification dangereuse de la validité du thread dangereuse.
SEM_TIMEDWAIT () utilise désormais des vérifications plus strictes pour les valeurs d'abstime déraisonnables - ce qui entraînerait des valeurs de délai inattendues.
PTW32_COND_WAIT_CLEANUP () ne consomme plus mystérieusement les signaux CV mais peut produire des réveils plus faux. On pense que l'appel SEM_TIMEDWAIT () consomme un signal CV qu'il ne devrait pas.
Correction d'une fuite de mémoire dans ptw32_threaddestroy () pour les threads implicites.
Potentiel fixe de l'impasse dans pthread_cond_destroy (). Une impasse pourrait se produire pour les CV déclarés statiquement (pthread_cond_initializer), lorsqu'un thread tente de détruire la variable de condition tandis qu'un autre tente de l'initialiser dynamiquement.
Auparavant, s'il n'est pas défini, le style de nettoyage a été déterminé automatiquement à partir du compilateur / langue, et l'un des éléments suivants a été défini en conséquence:
PTW32_CLEANUP_SEH MSVC only
PTW32_CLEANUP_CXX C++, including MSVC++, GNU G++
PTW32_CLEANUP_C C, including GNU GCC, not MSVC
Ceux-ci définissent le style de nettoyage (voir pthread.h) et, surtout, la façon dont l'annulation et la sortie du thread (via pthread_exit) sont effectuées (voir la routine ptw32_throw () dans private.c).
En bref, les versions des exceptions de la bibliothèque lancent une exception lorsqu'un thread est annulé ou sort (via pthread_exit ()), qui est capturé par un gestionnaire de la routine de démarrage du fil, de sorte que le détente de pile correct se produit quel que soit l'endroit où le fil de démarrage Le thread est quand il est annulé ou quitte via pthread_exit ().
Dans ce jeu d'instantanés et futurs, sauf si la construction définit explicitement (par exemple via une option de compilateur) PTW32_CLEANUP_SEH, PTW32_CLEANUP_CXX, ou PTW32_CLEANUP_C, alors la construction est désormais toujours par défaut à PTW32_CLEALUP_C STYLE CHETYUP. Ce style utilise SETJMP / LONGJMP dans les implémentations d'annulation et PTHEAD_EXIT, et ne fera donc pas de se dérouler de pile même lorsqu'il est lié à des applications qui l'ont (par exemple les applications C ++). Ceci est pour la cohérence avec les implémentations commerciales commerciales des threads UNIX POSIX. Le TRU64 de Compaq pourrait être une exception (pas de jeu de mots) et une tendance future possible.
Bien qu'il n'ait pas été clairement documenté auparavant, il est toujours nécessaire de créer votre application en utilisant le même PTW32_CLEANUP_ * Définir comme a été utilisé pour la version de la bibliothèque avec laquelle vous vous connectez, afin que les parties correctes de Pthread.h soient incluses. C'est-à-dire que les définies possibles nécessitent les versions de bibliothèque suivantes:
PTW32_CLEANUP_SEH pthreadVSE.dll
PTW32_CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll
PTW32_CLEANUP_C pthreadVC.dll or pthreadGC.dll
Par exemple, que votre application soit C ou C ++, si vous vous connectez avec PTHREADVC.LIB ou LIBPTHREADGCC.A, vous devez définir PTW32_CLEANUP_C.
Le point de tout cela est: si vous n'avez pas défini l'un d'eux explicitement, alors les valeurs par défaut décrites en haut de cette section étaient utilisées.
Cela change maintenant, comme cela a été expliqué ci-dessus, mais pour essayer de rendre cela plus clair, voici un exemple:
Si vous construisiez votre application avec MSVC ++, c'est-à-dire en utilisant des exceptions C ++ et ne pas définir explicitement l'un de PTW32_CLEANUP_ *, alors PTW32_CLEANUP_C ++ a été automatiquement défini pour vous dans Pthread.h. Vous devriez être lié à Pthreadvce.dll, qui empile le détente.
Si vous créez maintenant votre application comme vous l'avez fait auparavant, Pthread.h définira désormais automatiquement PTW32_CLEANUP_C comme style par défaut, et vous devrez créer un lien avec pthreadvc.dll. Le détente de pile ne se produira désormais pas lorsqu'un thread est annulé, ou que le thread appelle PTHEAD_EXIT ().
Votre demande se comportera désormais très probablement différemment des versions précédentes et de manière non évidente. C'est probablement que les objets instanciés localement peuvent ne pas être détruits ou nettoyés après l'annulation d'un fil.
Si vous voulez le même comportement qu'auparavant, vous devez maintenant définir explicitement PTW32_CLEANUP_C ++ à l'aide d'une option de compilateur et liez avec PTHEADVCE.DLL comme vous l'avez fait auparavant.
Pourquoi rendons-nous le style par défaut moins adapté aux exceptions? Parce qu'aucune implémentation commerciale Unix POSIX Threads ne vous permet de choisir de se dérouler de pile. Par conséquent, le fournir dans Pthread-win32 comme défaut est dangereux. Nous fournissons toujours le choix, mais à moins que vous ne choisissiez consciemment de faire autrement, vos applications PTHEADS s'exécuteront désormais ou se bloqueront de manière similaire, quelle que soit la plate-forme de threads que vous utilisez. Ou du moins c'est l'espoir.
Pourquoi ne pas supprimer complètement les versions des exceptions de la bibliothèque? Il y a plusieurs raisons:
Afin de permettre de générer des tailles d'images plus petites pour des applications qui sont liées statiquement à la bibliothèque, la plupart des routines ont été séparées en fichiers de code source individuels.
Cela se fait de manière à être compatible en arrière. Les anciens fichiers source sont réutilisés pour rassembler les fichiers de routine individuels en unités de traduction plus grandes (via un tas de #includes) afin que le compilateur puisse toujours optimiser dans la mesure du possible, par exemple par l'inclinaison, ce qui ne peut être fait que dans la même unité de traduction.
Il est également possible de construire toute la bibliothèque en compilant le fichier unique nommé "pthread.c", qui ne fait que #incluse tous les fichiers source de congrégation secondaire. Le compilateur peut être en mesure de l'utiliser pour faire plus d'inclinaison des routines.
Bien que le compilateur GNU soit capable de produire des bibliothèques avec la séparation nécessaire (le commutateur-segments -ffonctionnement), AFAIK, le MSVC et d'autres compilateurs n'ont pas cette fonctionnalité.
Enfin, comme j'utilise des makefiles et une compilation de ligne de commande, je ne sais pas quelcs cette réorganisation peut provoquer des utilisateurs de fichiers de projet IDE. Vous devriez pouvoir continuer à utiliser vos fichiers de projet existants sans modification.
pthread_num_processors_np ():
Renvoie le nombre de processeurs dans le système disponibles pour le processus, comme déterminé à partir du masque d'affinité du processeur.
pthread_timechange_handler_np ():
Pour améliorer la tolérance contre les changements d'horloge du système initié par l'opérateur ou le service.
Cette routine peut être appelée par une application lorsqu'elle reçoit un message WM_timechange du système. À l'heure actuelle, il diffuse toutes les variables de condition afin que les fils d'attente puissent se réveiller et réévaluer leurs conditions et redémarrer leurs attentes chronométrées si nécessaire.
Comme Win95 n'en fournit pas, la bibliothèque contient désormais sa propre routine interlockedCompaExchange (), qui est utilisée chaque fois que Windows ne le fournit pas. InterlockedCompaEExchange () est utilisé pour implémenter des spinlocks et des barrières, ainsi que dans Mutexes. Cette routine repose sur l'instruction de la machine CMPXCHG qui n'est pas disponible sur les processeurs i386. Cette bibliothèque (à partir de Snapshot 20010712) n'est donc plus prise en charge sur les plates-formes de processeurs I386.
Pour la portabilité du code source uniquement - les RWLocks ne peuvent pas encore être partagés de processus.
pthread_rwlockattr_init()
pthread_rwlockattr_destroy()
pthread_rwlockattr_setpshared()
pthread_rwlockattr_getpshared()
Tel que défini dans la nouvelle norme POSIX, et la seule version Unix Spec version 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()
[Pas encore pour G ++]
Cela a été fait pour empêcher les conflits.
Handle, DWORD et NULL sont temporairement définis dans Pthread.h s'ils ne le sont pas déjà.
Non seulement pour éviter la nécessité du fichier pthread.def, mais pour améliorer les performances. Apparemment, la déclaration des fonctions avec Dllimport génère un appel direct à la fonction et évite la surcharge d'un appel de fonction Stub.
Cela pourrait être rendu transparent aux applications en remplaçant les macros qui définissent les versions C ++ et SEH actuelles de PTHREAD_CLEANUP_PUSH / POP avec la version C, mais les gestionnaires de nettoyage AFAIK ne s'exécuteraient pas alors dans la séquence correcte avec des destructeurs et des gestionnaires de nettoyage exception .
L'annulation une fois démarrée dans un fil ne peut pas maintenant être annulée par inadvertance. Autrement dit, une fois qu'un thread commence son entraînement d'annulation, l'annulation est désactivée et une demande d'annulation ultérieure renvoie une erreur (ESRCH).
ERRNO: une directive de compilateur incorrect a provoqué l'utilisation d'une version locale d'Errno à la place du Win32 Errno. Les deux instances sont en filetage, mais les applications vérifiant ERRNO après un appel PTHREADS-WIN32 seraient erronés. La fixation de cela a également corrigé une mauvaise option de compilateur dans le testsuite (/ mt aurait dû être / MD) qui est nécessaire pour lier la bibliothèque correcte msvcrt.lib.
A ajouter
A ajouter
Nouveau:
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.
Bogues corrigées:
MSVC++ C++ exception handling.
De nouveaux tests ont été ajoutés.
Nouveau:
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
Bogues corrigées:
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)
De nouveaux tests ont été ajoutés.
Bogues corrigées:
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).
Quelques améliorations de compatibilité ajoutées, par exemple.
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)
De nouveaux tests ont été ajoutés.
Correction de bogues - L'annulation des threads en attente de variables de condition fonctionne maintenant correctement (Lorin Hochstein et Peter Slacik)
Correction du nettoyage de la pile d'exception si appelez pthread_exit ()
Correction des bogues en variables de condition - (Peter Slacik): - Vérification des affirmations supplémentaires - Ajustez correctement le nombre de threads d'attente après le délai d'expiration condvar chronométré.
Certains bogues mineurs ont été corrigées. Voir le fichier Changelog pour plus de détails.
Certaines fonctions plus POSIX 1B sont maintenant incluses mais ony renvoie une erreur (Enosys) si elle est appelée. Ils sont:
sem_open
sem_close
sem_unlink
sem_getvalue
Certaines fonctions POSIX 1B qui ont été prises en charge en interne sont désormais disponibles sous forme de fonctions exportées:
sem_init
sem_destroy
sem_wait
sem_trywait
sem_post
sched_yield
sched_get_priority_min
sched_get_priority_max
Certains bogues mineurs ont été corrigées. Voir le fichier Changelog pour plus de détails.
Version initiale.