Fork pthread-win32
combinado de RedFox20 + Oktonion + WinBuild
PThread https://github.com/WinBuilds/pthread-win32 alterações:
Este é um fork da versão 2.10.0.0 do pacote pthreads-win32. O ABI deste fork é diferente do original.
Mudanças feitas:
O tipo do contador de reutilização em ptw32_handle_t
foi alterado de int
para size_t
para facilitar servidores de longa execução.
Elementos não utilizados removidos de pthread_once_t
Esta biblioteca é testada frequentemente com nossos outros projetos do Visual Studio 2022.
Geralmente eu uso (e tenho usado) os arquivos de projeto MSVC20xx para meu trabalho. Os Makefiles têm sido usados com muito menos frequência e podem estar desatualizados.
Observe a mensagem de commit d4b0ef6b: embora o projeto MSVC2022/2019 tenha sido configurado para se adequar às minhas configurações internas, ele pode não se adequar às suas.
É claro que você sempre pode editar as configurações manualmente, mas quando precisar fazer isso para muitos arquivos de projeto vcxproj
, criar um script para a tarefa pode ser a melhor opção. Consulte update-vcxproj.js
e patch-vcxproj.js
para exemplos de scripts que fazem esse tipo de coisa. Eu os uso para garantir que todos os meus projetos C/C++ tenham exatamente as mesmas configurações de compilação, para que eu não tenha nenhuma surpresa desagradável em tempo de execução porque algum projeto decidiu construir com bibliotecas de tempo de execução de depuração/liberação estática/DLL ligeiramente diferentes, etc.etc.: os zilhões de maneiras que você pode conseguir ?? pelo seu sistema de compilação em um ambiente Windows. Diversão! ?
(2021-12-17)
Esta é uma micro versão com correções principalmente administrativas.
mkdir b && cd b && cmake -G "Visual Studio 16 2019" ..
: OK. Isso significa que vários bugs ocultos foram corrigidos e incluímos uma solução alternativa para a porcaria do CMake (ainda não gosto dessa ferramenta) quando fontes C devem ser compiladas condicionalmente como C++ (veja também pthread-EH.cpp e pthread-JMP.c: dois novos arquivos fonte do wrapper). Esta é uma micro versão com correções principalmente administrativas.
As compilações MSVC e MinGW64 foram testadas na arquitetura SMP (Intel x64 Hex Core) completando o conjunto de testes incluído, bem como os testes de estresse e de bancada.
Certifique-se de executar suas compilações no conjunto de testes. Se você observar falhas, considere como seus conjuntos de ferramentas podem estar contribuindo para a falha. Consulte o arquivo README para obter descrições mais detalhadas das cadeias de ferramentas e sistemas de teste que usamos para fazer os testes passarem com êxito.
Recomendamos MinGW64 em vez de MinGW para compilações GNU CC de 64 e 32 bits apenas porque o tratamento de exceção MinGW DWARF2 com compilações C++ causa alguns problemas com cancelamento de thread.
MinGW64 também inclui sua própria implementação nativa de pthreads, que você pode preferir usar. Se desejar construir nossa biblioteca, você precisará selecionar a opção de threads nativos do Win32 no momento da instalação. Recomendamos também selecionar o método de tratamento de exceção SJLJ para compilações MinGW64-w32. Para compilações MinGW64-w64, o método de tratamento de exceções SJLJ ou SEH deve funcionar.
(08/08/2018)
Observe que esta é uma nova versão principal. O incremento da versão principal introduz duas alterações de ABI junto com outras alterações de nomenclatura que exigirão a recompilação de aplicativos vinculados e possivelmente algumas alterações textuais nas referências de macro em tempo de compilação em arquivos de configuração e de origem, por exemplo, alterações de PTW32_* para PTW32_ , ptw32_ para ptw32_*, etc. .
Com a concordância de todos os contribuidores relevantes, o pthreads-win32 / pthreads4w versão 3, com exceção de quatro arquivos, está sendo lançado sob os termos da Licença Apache v2.0. O APLv2 é compatível com as licenças GPLv3 e LGPLv3 e, portanto, este código pode continuar a ser incluído legalmente nos projetos GPLv3 e LGPLv3.
Um contribuidor relevante substancial foi definido como aquele que contribuiu com código original que implementa um recurso presente nas versões futuras. Isso exclui vários contribuidores que contribuíram com código obsoleto ou forneceram patches que corrigem bugs, reorganizam código para fins estéticos ou práticos ou melhoram processos de construção. Esta distinção foi necessária para avançar na probabilidade de nem todos os colaboradores serem contactáveis. Todos os contribuidores estão listados no arquivo CONTRIBUIDORES.
Os quatro arquivos que permanecerão LGPL, mas mudarão para v3, são arquivos usados para configurar as compilações do ambiente GNU:
aclocal.m4
configure.ac
GNUmakefile.in
tests/GNUmakefile.in
Os colaboradores que solicitaram esta alteração ou concordaram com ela quando consultados são:
As versões pthreads-win32 / pthreads4w versão 2 permanecerão LGPL, mas a versão 2.11 e posteriores serão lançadas sob a v3 dessa licença para que quaisquer adições ao código pthreads4w versão 3 que seja portado para v2 não poluam esse código.
Algumas alterações de 26/02/2011 em diante podem não ser compatíveis com sistemas anteriores ao Windows 2000.
Novas correções de bugs em todas as versões desde 2.8.0 NÃO foram aplicadas à série 1.xx.
As compilações MSVC, MinGW e MinGW64 foram testadas na arquitetura SMP (Intel x64 Hex Core) completando o conjunto de testes incluído, bem como os testes de estresse e de bancada.
Certifique-se de executar suas compilações no conjunto de testes. Se você observar falhas, considere como seus conjuntos de ferramentas podem estar contribuindo para a falha. Consulte o arquivo README para obter descrições mais detalhadas das cadeias de ferramentas e sistemas de teste que usamos para fazer os testes passarem com sucesso.
Recomendamos MinGW64 em vez de MinGW para compilações GNU CC de 64 e 32 bits apenas porque o tratamento de exceção MinGW DWARF2 com compilações C++ causa alguns problemas com cancelamento de thread.
MinGW64 também inclui sua própria implementação nativa de pthreads, que você pode preferir usar. Se desejar construir nossa biblioteca, você precisará selecionar a opção de threads nativos do Win32 no momento da instalação. Recomendamos também selecionar o método de tratamento de exceções SJLJ para compilações MinGW64-w32. Para compilações MinGW64-w64, o método de tratamento de exceções SJLJ ou SEH deve funcionar.
Além do seguinte, esta versão é equivalente em recursos à v2.11.0.
Esta versão introduz uma mudança em pthread_t e pthread_once_t que afetará os aplicativos vinculados à biblioteca.
pthread_t: permanece uma estrutura, mas estende o contador de reutilização de 32 bits para 64 bits. Em máquinas de 64 bits, o tamanho geral do objeto não aumentará, simplesmente colocamos 4 bytes de preenchimento em bom uso, reduzindo o risco de que o contador possa ser enrolado em aplicativos de execução muito longa, de pequeno a, efetivamente, zero. O contador de reutilização de 64 bits estende o tempo de execução sem risco de meses (assumindo uma vida útil média do thread de 1 ms) para séculos (assumindo uma vida útil média do thread de 1 ns).
pthread_once_t: remove dois elementos obsoletos e reduz seu tamanho.
(08/08/2018)
Novas correções de bugs em todas as versões desde 2.8.0 NÃO foram aplicadas à série 1.xx.
Algumas alterações de 26/02/2011 em diante podem não ser compatíveis com sistemas anteriores ao Windows 2000.
pthreads-win32 / pthreads4w versão 2.11 e todas as versões 2.x futuras serão lançadas sob a Licença Pública Lesser GNU versão 3 (LGPLv3).
A próxima versão principal deste software (versão 3) será lançada sob a licença Apache versão 2.0 (ALv2). O lançamento do 2.11 sob LGPLv3 permitirá que modificações na versão 3 deste software sejam transportadas para a versão 2 daqui para frente. Além disso, qualquer projeto GPL que atualmente utilize esta biblioteca poderá continuar a utilizar a versão 2 ou 3 deste código em seus projetos.
Para obter mais informações, consulte: https://www.apache.org/licenses/GPL-compatibility.html
Para permanecer consistente com esta alteração, a partir de agora modificações nesta biblioteca só serão aceitas em relação à versão 3 deste software nos termos do ALv2. Eles serão então, quando apropriado, transferidos para a versão 2.
Esperamos lançar a versão 3 ao mesmo tempo que lançamos a versão 2.11.
Esta versão foi testada na arquitetura SMP (Intel x64 Hex Core) completando o conjunto de testes incluído, bem como os testes de estresse e de bancada.
Certifique-se de executar suas compilações no conjunto de testes. Se você observar falhas, considere como seus conjuntos de ferramentas podem estar contribuindo para a falha. Consulte o arquivo README para obter descrições mais detalhadas das cadeias de ferramentas e sistemas de teste que usamos para fazer os testes passarem com sucesso. Recomendamos MinGW64 em vez de MinGW32 para compilações GNU CC de 64 e 32 bits. MinGW64 também inclui sua própria implementação independente de pthreads, que você pode preferir usar.
Para compilações de conjunto de ferramentas da Microsoft: (1) A vinculação estática requer que esta biblioteca e quaisquer bibliotecas ou aplicativos de vinculação sejam compiladas com /MT de forma consistente.
(2) As bibliotecas estáticas foram renomeadas como libpthreadV*.lib para diferenciá-las das bibliotecas de importação de DLL pthreadV*.lib.
(3) Se você estiver usando ligação mista, por exemplo, vinculando a versão estática /MT da biblioteca a um aplicativo vinculado a /MD você poderá usar GetLastError() para interrogar o código de erro porque a biblioteca define errno (via _set_errno ()) e SetLastError().
Remova a tentativa de definir PTW32_USES_SEPARATE_CRT nos cabeçalhos que podem causar resultados inesperados. Em certas situações, um usuário pode querer defini-lo explicitamente em seu ambiente para invocar seus efeitos, seja ao construir a biblioteca, um aplicativo ou ambos. Consulte README.NONPORTABLE. -Ross Johnson
A biblioteca deve ser mais confiável em cenários totalmente vinculados estaticamente. Nota: removemos o código PIMAGE_TLS_CALLBACK e revertemos para o método anterior que parece ser mais confiável em todas as edições do compilador.
Várias correções no GNUmakefile. Embora este arquivo tenha sido removido, para completar as alterações foram registradas como commits no repositório.
MinGW64-w64 define pid_t como __int64. sched.h agora reflete isso.
Vários testes foram corrigidos e falharam em máquinas sob carga. Outros testes que usaram mecanismos brutos semelhantes para sincronizar threads (estes são testes unitários) tiveram as mesmas melhorias aplicadas: semaphore5.c reconhece que sem_destroy pode retornar EBUSY legitimamente; mutex6*.c, mutex7*.c e mutex8*.c substituíram um único Sleep() por um loop de pesquisa.
(18/09/2016)
Novas correções de bugs em todas as versões desde 2.8.0 NÃO foram aplicadas à série 1.xx.
Algumas alterações de 26/02/2011 em diante podem não ser compatíveis com sistemas anteriores ao Windows 2000.
Esta versão foi testada na arquitetura SMP (Intel x64 Hex Core) completando o conjunto de testes incluído, bem como os testes de estresse e de bancada.
Certifique-se de executar suas compilações no conjunto de testes. Se você observar falhas, considere como seus conjuntos de ferramentas podem estar contribuindo para a falha. Consulte o arquivo README para obter descrições mais detalhadas das cadeias de ferramentas e sistemas de teste que usamos para fazer os testes passarem com êxito. Recomendamos MinGW64 em vez de MinGW32 para compilações GNU CC de 64 e 32 bits. MinGW64 também inclui sua própria implementação independente de pthreads, que você pode preferir usar.
Novas rotinas: 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()
Os ambientes do compilador GNU (MinGW32 e MinGW64) agora têm a opção de usar o autoconf para configurar automaticamente a compilação.
Builds: Novos alvos makefile foram adicionados e alvos existentes modificados ou removidos. Por exemplo, o objetivo é construir e testar todas as configurações possíveis de dll e bibliotecas estáticas.
As compilações do compilador GNU agora usam explicitamente a compatibilidade dos padrões ISO C e C++ 2011. Se o seu compilador GNU não suportar isso, considere atualizar. A configuração automática agora é possível através do script 'configure'. O script deve ser gerado usando autoconf - veja o arquivo README. Agradecimentos a Keith Marshall do projeto MinGW.
Vinculação estática: a funcionalidade autoestática foi movida para dll.c e estendida para que compilações usando MSVC8 e posteriores não exijam mais que os aplicativos chamem pthread_win32_thread_detach_np(). Ou seja, toda a funcionalidade DllMain agora é automática para vinculação estática para essas compilações.
Alguns destinos de ligação estática nmake foram desativados: Devido a um problema com o comportamento do TLS, os destinos nmake V*-small-static* no Makefile foram desativados. O problema é exposto por testes/semaphore3.c onde a chamada pthread_self() dentro do thread falha ao retornar o identificador de thread POSIX correto, mas retorna um novo identificador de thread POSIX "implícito". Os identificadores pthread implícitos têm status de thread desanexado, o que faz com que a chamada pthread_detach() dentro do thread retorne EINVAL. Os alvos V*-static* parecem não ter sido afetados. A principal diferença é que estes últimos são gerados a partir de uma única unidade de compilação.
A vinculação estática de arquivos de objetos pequenos agora funciona (MinGW). O código autostático é necessário, mas nada referenciou explicitamente esse código, por isso estava sendo otimizado.
sem_getvalue() poderia retornar o valor errno em vez de definir errno e retornar -1.
Valores errados seriam perdidos se a biblioteca estivesse vinculada estaticamente à biblioteca de tempo de execução, o que significa também que o aplicativo usava uma instância de tempo de execução separada. Este ainda é o caso, exceto que foi adicionada uma opção de construção que permite a incorporação de um status de erro mais robusto, ou seja, permite que o código de retorno seja recuperado via GetLastError().
Identificou a causa de falhas significativas em torno do cancelamento e pthread_exit() para a configuração de compilação GCE (GNU C++) proveniente do Mingw32. Não tenho certeza se isso é geral ou apenas ao criar bibliotecas e aplicativos de 32 bits executados em sistemas de 64 bits. Essas falhas não surgem com compilações Mingw64 de 32 bits (GCC construído com multilib habilitado) em execução em sistemas de 64 bits.
O bug pthread_key_delete() introduzido na versão 2.9.x fez com que essa rotina falhasse de uma forma que o conjunto de testes não estava detectando. Um novo teste foi adicionado para confirmar se esta rotina se comporta corretamente, principalmente quando chaves com destruidores são excluídas antes da saída dos threads.
pthread_win32_process_attach_np() corrige possíveis falhas/segurança ao encontrar e carregar QUSEREX.DLL.
_POSIX_THREAD_ATTR_STACKADDR agora é igual a -1 em pthread.h. Como consequência, pthread_attr_setstackaddr() agora retorna ENOSYS. Anteriormente, o valor era armazenado e podia ser recuperado, mas não era utilizado. pthread_attr_getstackaddr() retorna ENOSYS correspondentemente.
Corrigido um possível vazamento de memória em pthread_mutex_init(). O vazamento só ocorreria se a inicialização do mutex falhasse (extremamente raro, se é que alguma vez).
Corrigidos tempos limite de menos de milissegundos, que faziam com que a biblioteca ficasse ocupada em espera.
Corrija uma condição de corrida e trave nos bloqueios MCS. O código de gerenciamento de fila de espera em ptw32_mcs_lock_acquire estava competindo com o código de gerenciamento de fila em ptw32_mcs_lock_release e causando uma falha de segmentação.
(27/05/2012)
Novas correções de bugs nesta versão desde 2.8.0 NÃO foram aplicadas à série 1.xx.
Esta versão substitui uma versão 2.9.0 extremamente breve e adiciona algumas alterações não relacionadas ao código de última hora que foram feitas para incorporar melhores propriedades descritivas nas DLLs para indicar a arquitetura de destino e ambientes de construção.
Algumas alterações posteriores a 26/02/2011 no CVS podem não ser compatíveis com sistemas anteriores ao Windows 2000.
O uso de outra versão da biblioteca que não seja "C" agora é desencorajado. Ou seja, a versão "C++" falha em alguns testes e não fornece nenhuma funcionalidade adicional.
Esta versão foi testada na arquitetura SMP (Intel x64 Hex Core) completando o conjunto de testes incluído, testes de estresse e de bancada.
As propriedades da DLL agora incluem corretamente a arquitetura de destino, ou seja, clique com o botão direito no arquivo pthreadVC2.dll no explorer e escolha a guia Detalhe para mostrar o compilador e a arquitetura no campo de descrição, por exemplo, "MS C x64" ou "MS C x86".
A dependência da biblioteca Winsock agora é discricionária via #define RETAIN_WSALASTERROR
em config.h. É indefinido por padrão, a menos que WINCE seja definido (porque eu (RJ) não tenho certeza da dependência lá).
(compilações MSC e GNU) A biblioteca vinculada estaticamente agora inicializa e limpa automaticamente no início/saída do programa, ou seja, aplicativos vinculados estaticamente não precisam chamar as rotinas pthread_win32_process_attach_np() e pthread_win32_process_detach_np() explicitamente. A rotina por thread pthread_win32_thread_detach_np() também é chamada na saída do programa para limpar recursos POSIX adquiridos pelo thread nativo primário do Windows, se eu (RJ) entender o processo corretamente. Outros threads nativos do Windows que chamam rotinas de API POSIX podem precisar chamar a rotina de desanexação de thread na saída do thread se o aplicativo depender de recursos POSIX recuperados ou da execução de destruidores POSIX TSD (TLS). Consulte README.NONPORTABLE para obter descrições dessas rotinas.
Mutexes robustos são implementados no escopo PROCESS_PRIVATE. NOTA que as funções pthread_mutex_* podem retornar códigos de erro diferentes para mutexes robustos do que normalmente fariam em uso normal, por exemplo, pthread_mutex_unlock é necessário para verificar a propriedade de todos os tipos de mutex quando o mutex é robusto, enquanto isso não ocorre para o "normal" não- tipo mutex robusto.
pthread_getunique_np é implementado para compatibilidade no nível de origem com algumas outras implementações. Esta rotina retorna um número de sequência de 64 bits associado exclusivamente a um thread. Ele pode ser usado por aplicativos para solicitar ou fazer hash de identificadores de thread POSIX.
Muitas mais mudanças para sistemas de 64 bits.
Várias modificações e correções para construir e testar o WinCE.
Corrija pthread_cond_destroy() - não deve ser um ponto de cancelamento. Outros pequenos problemas de construção corrigidos.
Remova a condição de deadlock potencial de pthread_cond_destroy().
Várias modificações para construir e testar para Win64.
Várias correções para a DLL auxiliar de cancelamento assíncrono QueueUserAPCEx (este é um download separado) e limpezas de código pthreads.
Removida possível referência de ponteiro NULL.
Removido o requisito de que os aplicativos restrinjam o número de threads que chamam pthread_barrier_wait apenas para a contagem de barreiras. Também reduziu a contenção entre barreira_wait e barreira_destroy. Essa mudança terá desacelerado ligeiramente as barreiras, mas reduzirá pela metade o número de semáforos consumidos por barreira para um.
Corrigido um vazamento de identificador no sched_[gs]etscheduler.
Removidas todas as macros de compatibilidade de função reentrante POSIX de pthread.h. Alguns simplesmente não eram semanticamente corretos.
Threads não tentam mais passar exceções não detectadas fora do escopo do thread (somente compilações C++ e SEH). Exceções não detectadas agora fazem com que o thread saia com o código de retorno PTHREAD_CANCELED.
Muitas correções de conversão, especialmente para x64, correções intertravadas e retrabalho para x64.
A dependência da biblioteca Winsock agora é discricionária via #define RETAIN_WSALASTERROR
em config.h. É indefinido por padrão, a menos que WINCE seja definido (porque RJ não tem certeza da dependência ali).
Vários mutexes POSIX estáticos usados para gerenciamento interno foram substituídos por bloqueios baseados em fila MCS para reduzir o consumo de recursos, em particular o uso de objetos Win32.
Por segurança, o QuserEx.dll, se usado, agora deve ser instalado na pasta Sistema Windows.
robusto[1-5].c - Mutexes robustos sequência1.c - números de sequência exclusivos por thread
Todos os testes mutex*.c, sempre que apropriado, foram modificados para testar também mutexes robustos nas mesmas condições. Adicionados testes de bancada mutex robustos a benchtest*.c sempre que apropriado.
(22/12/2006)
Novas correções de bugs nesta versão desde 2.7.0 não foram aplicadas à série da versão 1.xx. Provavelmente é hora de abandonar a versão 1.
Esta versão ainda não foi testada em arquiteturas SMP. Todos os testes passam em um sistema uniprocessador.
Sem_destroy poderia retornar EBUSY mesmo que nenhum thread estivesse aguardando no semáforo. Outras corridas em torno da invalidação de estruturas de semáforo (internamente) também foram removidas.
semaphore5.c - testa a correção do bug mencionada acima.
(04/06/2005)
Todos os novos recursos desta versão foram portados na versão 1.11.0, incluindo a incorporação de bloqueios MCS em pthread_once, no entanto, as versões 1 e 2 permanecem incompatíveis, embora agora sejam idênticas em desempenho e funcionalidade.
Esta versão foi testada (passou no conjunto de testes) em sistemas uniprocessadores e multiprocessadores.
Pthread_once foi reimplementado para remover o aumento de prioridade e outras complexidades para melhorar a robustez. Corridas para identificadores Win32 que não são exclusivos de reciclagem foram removidas. A forma geral de pthread_once é agora a mesma sugerida anteriormente por Alexander Terekhov, mas em vez do 'mutex nomeado', foi implementado um bloqueio baseado em fila que possui as propriedades necessárias de autoinicialização e destruição dinâmicas. Este bloqueio também é eficiente. A ABI não é afetada, pois o tamanho de pthread_once_t não mudou e PTHREAD_ONCE_INIT não mudou, no entanto, os aplicativos que espiam dentro de pthread_once_t, que deveria ser opaco, serão interrompidos.
(19/05/2005)
Todas as correções de bugs e novos recursos desta versão foram portados na versão 1.10.0.
Esta versão foi testada (passou no conjunto de testes) em sistemas uniprocessadores e multiprocessadores. Obrigado a Tim Theisen da TomoTherapy por executar exaustivamente os testes de MP e por fornecer observações e dados cruciais quando falhas são detectadas.
(09/05/2005)
O pacote agora inclui um conjunto de documentação de referência que consiste em páginas de manual em estilo Unix formatadas em HTML que foram editadas para consistência com pthreads-win32. O conjunto também pode ser lido online em: http://sources.redhat.com/pthreads-win32/manual/index.html
Obrigado novamente a Tim Theisen por executar o pré-lançamento do conjunto de testes em um sistema MP.
Todas as correções de bugs e novos recursos desta versão foram portados na versão 1.9.0.
A implementação alterada evita a necessidade do HANDLE problemático e recupera a memória assim que a chave é excluída OU o thread sai, o que ocorrer primeiro.
Agradecimentos a Richard Hughes da Aculab por identificar e localizar o vazamento.
Os destruidores de chave TSD agora são processados até PTHREAD_DESTRUCTOR_ITERATIONS vezes em vez de apenas uma vez. PTHREAD_DESTRUCTOR_ITERATIONS foi definido em pthread.h há algum tempo, mas não é usado.
Corrigida uma corrida contábil de semáforo entre sem_post/sem_post_multiple e cancelamento de sem_wait. Este é o mesmo problema do sem_timedwait que foi corrigido na última versão.
sem_init, sem_post e sem_post_multiple agora verificam se a contagem do semáforo nunca excede _POSIX_SEM_VALUE_MAX.
Embora sigwait() nada mais seja do que um ambiente autônomo, deveria ser pelo menos um ponto de cancelamento para ser consistente com o padrão.
stress1.c - tenta expor problemas na variável de condição e na lógica de espera cronometrada do semáforo. Este teste foi inspirado no exemplo de código de teste de Stephan Mueller usado para identificar o bug sem_timedwait da última versão. Não faz parte do conjunto de testes regular porque pode demorar um pouco para ser executado. Para executá-lo: nmake clean VC-stress
tsd2.c - testa se os destruidores de chave são executados novamente se o valor da chave tsd não for NULL após a execução da rotina do destruidor. Também testa se pthread_setspecific() e pthread_getspecific() podem ser chamados de destruidores.
(26/04/2005)
Agora não há planos para lançar uma versão 3.0.0 para corrigir problemas em pthread_once(). Outras possíveis implementações de pthread_once ainda serão investigadas para um possível lançamento futuro na tentativa de reduzir a complexidade da implementação atual.
Todas as correções de bugs e novos recursos desta versão foram portados para a versão 1.8.0.
Corrigida corrida pthread_once (falhas em um sistema MP). Obrigado a Tim Theisen por executar exaustivos testes de pré-lançamento em seu sistema MP usando uma variedade de compiladores: VC++ 6 VC++ 7.1 Intel C++ versão 8.0 Todos os testes foram aprovados. Algumas pequenas melhorias de velocidade também foram feitas.
Corrigido erro de saturação de número inteiro em pthread_mutex_timedlock() - perdido quando sem_timedwait() foi corrigido na versão 2.2.0. Esta rotina não retorna mais ENOTSUP quando NEED_SEM é definido - ela é suportada (NEED_SEM só é necessário para versões WinCE anteriores a 3.0).
Corrigido bug de tempo limite em sem_timedwait().
Corrija vários problemas no código NEED_SEM incluído condicionalmente. O código NEED_SEM incluído é fornecido para sistemas que não implementam semáforos W32, como WinCE anteriores à versão 3.0. Uma implementação alternativa de semáforos POSIX é construída usando eventos W32 para esses sistemas quando NEED_SEM é definido. Este código foi completamente reescrito nesta versão para reutilizar a maior parte do código do semáforo POSIX padrão e, particularmente, para implementar todas as rotinas sem_* suportadas pelo pthreads-win32. Tim Theisen também executou o conjunto de testes no código NEED_SEM em seu sistema MP. Todos os testes foram aprovados.
A biblioteca agora é construída sem erros para o compilador Borland Builder 5.5.
pthread_once é muito complicado - mas funciona até onde os testes podem determinar.
A versão Borland da dll falha em alguns testes com uma exceção de leitura de memória. A causa ainda não é conhecida, mas um bug do compilador não foi descartado.
(12/04/2005)
A versão 1.7.0 é um backport de recursos e correções de bugs novos nesta versão. Consulte as notas anteriores na versão 2.0.0/General.
(04/04/2005)
Adicionados destinos makefile para construir versões de link estático da biblioteca. MinGW e MSVC. Observe que isso não implica qualquer alteração no licenciamento LGPL, que ainda impõe condições específicas à distribuição de software que esteja vinculado estaticamente a esta biblioteca.
Existe um bug conhecido em pthread_once(). O cancelamento do init_routine expõe um problema potencial de inanição (ou seja, deadlock) se um thread em espera tiver uma prioridade mais alta do que o thread de inicialização. Este problema será corrigido na versão 3.0.0 da biblioteca.
Corrigido erro de saturação de número inteiro em sem_timedwait(). Kevin Lussier
Corrija as diretivas do pré-processador para vinculação estática. Dimitar Panayotov
(16/03/2005)
(16/03/2005)
Esta versão representa uma alteração da ABI e a nomenclatura da versão da DLL aumentou de 1 para 2, por exemplo, pthreadVC2.dll.
A versão 1.4.0 suporta a nova funcionalidade incluída nesta versão. Distribua DLLs criadas a partir dessa versão com atualizações para aplicativos criados em pthreads-win32 versão 1.xx
A nomenclatura do pacote mudou, substituindo a data do snapshot pelo número da versão + informações descritivas. Por exemplo, esta versão é "pthreads-win32-2-0-0-release".
Versão 1.3.0
Versão 1.2.0
Versão 1.1.0
Versão 1.0.0
Este instantâneo corrige principalmente o bug condvar introduzido no Snapshot-2004-11-03. O versão DLL também foi incluído para permitir que os aplicativos verifiquem as informações da versão DLL compatível com o Microsoft e estendam o sistema de nomeação de DLL para alterações da API da ABI e principal (compatível não bate-papo). Consulte o arquivo ReadMe para obter detalhes.
Um recurso de versão no estilo da Microsoft foi adicionado à DLL para aplicativos que desejam verificar a compatibilidade da DLL em tempo de execução.
A nomeação da DLL do PTHREADS-WIN32 foi estendida para permitir que versões DLL incompatíveis coexistam no mesmo sistema de arquivos. Consulte o arquivo ReadMe para obter detalhes, mas brevemente: enquanto as informações da versão dentro da DLL mudarão a cada lançamento a partir de agora, os nomes da versão DLL só mudarão se a nova DLL não for compatível com aplicativos mais antigos.
O esquema de versão foi emprestado da GNU Libtool, e o esquema de nomeação de DLL é da Cygwin. Desde que as regras de numeração no estilo bibtool sejam homenageadas, o esquema de nomeação da DLL da Cygwin garante automaticamente que as alterações no nome da DLL sejam mínimas e que os aplicativos não carreguem uma DLL incompatível de Pthreads-Win32.
Aqueles que usam as DLLs pré-construídos descobrirão que os nomes de DLL/LIB têm um novo sufixo (1) neste instantâneo. Por exemplo, pthreadvc1.dll etc.
Certos macros posix mudaram.
Essas alterações destinam -se a estar em conformidade com a única especificação UNIX versão 3, que afirma que, se definido como 0 (zero) ou não definido, os aplicativos podem usar sysconf () para determinar seus valores em tempo de execução. Pthreads-win32 não implementa sysconf ().
As macros a seguir não são mais indefinidas, mas definidas e definidas como -1 (não implementadas):
_POSIX_THREAD_ATTR_STACKADDR
_POSIX_THREAD_PRIO_INHERIT
_POSIX_THREAD_PRIO_PROTECT
_POSIX_THREAD_PROCESS_SHARED
As macros a seguir são definidas e definidas como 200112L (implementadas):
_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
As macros a seguir são definidas e definidas para os valores apropriados:
_POSIX_THREAD_THREADS_MAX
_POSIX_SEM_VALUE_MAX
_POSIX_SEM_NSEMS_MAX
PTHREAD_DESTRUCTOR_ITERATIONS
PTHREAD_KEYS_MAX
PTHREAD_STACK_MIN
PTHREAD_THREADS_MAX
As DLLs produzidas a partir deste instantâneo não podem ser usadas com aplicativos mais antigos sem recompilar o aplicativo, devido a uma alteração no pthread_t para fornecer IDs de encadeamento POSIX exclusivos.
Embora esse instantâneo passe o conjunto de testes estendido, muitas das mudanças são bastante importantes, e algumas aplicações podem mostrar comportamentos diferentes do que anteriormente, adote com cuidado. Felizmente, qualquer comportamento alterado será devido ao fato de a biblioteca ser melhor em seu trabalho, não pior.
pthread_create () não aceita mais nulo como a referência do thread arg. Um segfault (falha de acesso à memória) resultará e nenhum thread será criado.
pthread_barrier_wait () não atua mais como um ponto de cancelamento.
Corrija a condição de corrida potencial em pthread_once ()
Adicionado para compatibilidade: pthread_recursive_mutex_initializer, pthread_errorcheck_mutex_initializer, pthread_recursive_mutex_initializer_np, pthread_errorcheck_mutex_initializer_np
Suporte inicial ao compilador digital Mars
Mutexes mais rápidos. Estes foram reescritos após um modelo fornecido por Alexander Terekhov que reduz as verificações do espaço do kernel e elimina algumas seções críticas adicionais usadas para gerenciar uma corrida entre a expiração e o desbloqueio do tempo. Esteja ciente de que os novos mutexes não aplicam rigorosamente agendamento absoluto de mutexes, no entanto, qualquer aquisição de bloqueio fora de ordem deve ser muito rara.
Semáforos mais rápidos. Seguindo um modelo semelhante aos mutexes acima, eles foram reescritos para usar verificações espaciais preliminares dos usuários.
sem_getValue () agora retorna o número de garçons.
O ID do thread POSIX agora tem características de singularidade muito mais fortes. A biblioteca ganha -se para não reutilizar o mesmo ID do thread por pelo menos 2^(Wordsize) de destruição/criação de ciclos de destruição.
Semaphore4.C: Testes Cancelamento do novo sem_wait ().
Semaphore4t.c: Da mesma forma para sem_timedwait ().
rwlock8.c: testes e horários os caminhos de execução lenta dos bloqueios R/W e os CVs, mutexes e semáforos em que eles são construídos.
Tente adicionar Watcom à lista de compiladores que podem construir a biblioteca. Isso falhou no final devido ao seu errno sem thread. A biblioteca constrói, mas o conjunto de testes falha. Consulte Readme.watcom para obter mais detalhes.
NOTA: Se você não usar o cancelamento do Async em seu aplicativo ou não precisar cancelar threads bloqueados nos recursos do sistema, como a E/S de rede, o cancelamento assíncrono não preventivo padrão é provavelmente bom o suficiente. No entanto, o Pthreads-Win32 detecta automaticamente a disponibilidade desses componentes em tempo de execução, para que você não precise reconstruir a biblioteca da fonte se mudar de idéia posteriormente.
Todos os conselhos disponíveis nos livros e em outros lugares sobre a indesejabilidade de usar o cancelamento de assíncronos em qualquer aplicativo ainda permanece, mas esse recurso é uma adição bem -vinda em relação à conformidade da biblioteca ao padrão POSIX.
Limpeza do gerenciamento de prioridade do thread. Em particular, a definição da prioridade do thread agora tenta mapear os valores inválidos de Win32 dentro do intervalo retornado por sched_get_priority_min/max () para valores úteis. Consulte ReadMe.nonportable em "Prioridade do thread".
pthread_getschedParam () agora retorna a prioridade dada pela chamada mais recente para pthread_setschedParam () ou estabelecida por pthread_create (), conforme exigido pelo padrão. Anteriormente, Pthread_getSchedParam () retornou incorretamente a prioridade do encadeamento em execução no momento da chamada, que pode ter sido ajustada ou temporariamente promovida/rebaixada.
sched_get_priority_min () e sched_get_priority_max () agora retorne -1 em erro e defina errno. Anteriormente, eles retornaram incorretamente o valor de erro diretamente.
pthread_self () libertaria a alça de encadeamento POSIX implícita recém -criada se o DuplicateHandle falhasse em vez de reciclá -lo (muito improvável).
pthread_exit () não estava liberando nem reciclando a estrutura do encadeamento Posix para threads POSIX implícitos.
Desde a implementação original de John Bossom, a biblioteca permitiu que os threads inicializados não-Posix (threads win32) chamassem as rotinas PTHreads-win32 e, portanto, interajam com threads POSIX. Isso é feito criando um ID de encadeamento POSIX on-the-fly para o thread Win32 que, uma vez criado, permite interação totalmente reciprônica. Isso não se estendeu ao cancelamento do thread (assíncrono ou adiado). Agora sim.
Qualquer thread pode ser cancelado por qualquer outro thread (Win32 ou Posix) se o valor Posix Pthread_T do thread do antigo thread for conhecido. Seus destruidores de TSD e manipuladores de limpeza POSIX serão executados antes que o thread saia com um código de saída de pthread_canceled (recuperado com getExitCodethread ()).
Isso permite que um thread Win32, por exemplo, ligue para as rotinas POSIX CV da mesma maneira que os threads POSIX deveriam/deveriam, com Pthread_cond_wait () Cancelabilidade e manipuladores de limpeza (Pthread_cond_wait () é um ponto de cancelamento POSIX).
Ao adicionar cancelamento, os threads win32 agora devem ser capazes de chamar todas as rotinas do POSIX Threads que fazem sentido, incluindo semáforos, mutexes, variáveis de condição, travas de leitura/gravação, barreiras, spinlocks, TSD, push/pop de limpeza, cancelamento, pthread_exit, agendamento, etc. .
Observe que esses IDs de encadeamento POSIX "implícitos" estão inicializados como destacados (não juntáveis) com o tipo de cancelamento diferido. O ID do thread POSIX será criado automaticamente por qualquer rotina POSIX que precise de um identificador POSIX (a menos que a rotina precise de um pThread_T como um parâmetro, é claro). Um thread win32 pode descobrir o seu próprio ID do thread POSIX chamando Pthread_self (), que criará o identificador, se necessário, e retornará o valor pthread_t.
Teste o novo recurso acima.
Este instantâneo corrige alguma corrupção acidental para novas fontes de casos de teste. Não há alterações no código -fonte da biblioteca.
Várias mudanças para apertar a verificação do ARG e trabalhar com versões posteriores do MingW32 e MSYSDTK.
pthread_getschedParam () etc, verificação de validade de rosca perigosa fixa.
sem_timedwait () agora usa verificações mais rígidas para valores de abstim irracionais - isso resultaria em valores inesperados de tempo limite.
PTW32_COND_WAIT_CLEANUP () não consome mais sinais de CV, mas pode produzir despertadores mais espúrios. Acredita -se que a chamada sem_timedwait () esteja consumindo um sinal de CV que não deveria.
Corrigido um vazamento de memória em ptw32_threadDestroy () para threads implícitos.
Potencial corrigido para deadlock em pthread_cond_destroy (). Um impasse pode ocorrer para CVS declarado estaticamente (Pthread_cond_initializer), quando um thread está tentando destruir a variável de condição enquanto outro está tentando inicializá -lo dinamicamente.
Anteriormente, se não for definido, o estilo de limpeza era determinado automaticamente do compilador/idioma, e um dos seguintes foi definido de acordo:
PTW32_CLEANUP_SEH MSVC only
PTW32_CLEANUP_CXX C++, including MSVC++, GNU G++
PTW32_CLEANUP_C C, including GNU GCC, not MSVC
Estes definem determinar o estilo de limpeza (consulte Pthread.h) e, o mais importante, é executado a maneira como o cancelamento e a saída do thread (via pthread_exit) é executado (consulte a rotina ptw32_throw () em private.c).
Em resumo, as versões de exceções da biblioteca lançam uma exceção quando um thread é cancelado ou saídas (via pthread_exit ()), que é capturado por um manipulador na rotina de inicialização do thread, para que a pilha correta ocorra, independentemente de onde a coisa O thread é quando é cancelado ou sai via pthread_exit ().
Neste e futuros instantâneos, a menos que a compilação defina explicitamente (por exemplo, através de uma opção compiladora) PTW32_CLEANUP_SEH, PTW32_CLEANUP_CXX ou PTW32_CLEANUP_C, então a construção agora sempre se defende do PTW32_CLEANUP_C Cleanup. Esse estilo usa o setjmp/longjmp nas implementações de cancelamento e pThread_exit e, portanto, não fará empilhar desengate, mesmo quando vinculado a aplicativos que o possuem (por exemplo, aplicativos C ++). Isto é para consistência com a maioria das implementações comerciais de threads do UNIX POSIX. O Tru64 do Compaq pode ser uma exceção (sem trocadilhos) e uma possível tendência futura.
Embora não estivesse claramente documentado antes, ainda é necessário criar seu aplicativo usando o mesmo PTW32_CLEANUP_* Definir como foi usado para a versão da biblioteca com a qual você vincular, para que as partes corretas do pthread.h estejam incluídas. Ou seja, o possível define exige as seguintes versões da biblioteca:
PTW32_CLEANUP_SEH pthreadVSE.dll
PTW32_CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll
PTW32_CLEANUP_C pthreadVC.dll or pthreadGC.dll
Por exemplo, independentemente de o seu aplicativo ser C ou C ++, se você vincular com pthreadvc.lib ou libpthreadgc.a, deve definir PTW32_CLEANUP_C.
O objetivo de tudo isso é: se você não está definindo um deles explicitamente, os padrões descritos na parte superior desta seção estavam sendo usados.
Isso agora muda, como foi explicado acima, mas para tentar tornar mais claro aqui um exemplo:
Se você estava criando seu aplicativo com MSVC ++ IE usando exceções C ++ e não definindo explicitamente um dos PTW32_Cleanup_*, então PTW32_CLEANUP_C ++ foi definido automaticamente para você em Pthread.h. Você deveria estar vinculando -se ao pthreadvce.dll, que empilhará o desenrolar.
Se agora você criar seu aplicativo como você tinha antes, o Pthread.h agora definirá automaticamente o PTW32_CLEANUP_C como o estilo padrão e você precisará vincular -se ao PTHREADVC.DLL. O desenrolar da pilha agora não ocorre quando um thread for cancelado, ou o thread chama pthread_exit ().
Seu aplicativo agora provavelmente se comportará de maneira diferente com as versões anteriores e de maneiras não óbvias. Provavelmente é que os objetos instantados localmente não sejam destruídos ou limpos após o cancelamento de um thread.
Se você deseja o mesmo comportamento de antes, agora deve definir PTW32_CLEANUP_C ++ usando uma opção de compilador e vincular -se ao Pthreadvce.dll como você fez antes.
Por que estamos tornando o estilo padrão menos amigável para exceção? Porque nenhuma implementação comercial do UNIX POSIX POSIX permite que você opte por ter a desenrolar da pilha. Portanto, fornecê-lo no Pthread-Win32 como padrão é perigoso. Ainda fornecemos a opção, mas, a menos que você opte conscientemente, seus aplicativos PTHreads agora serão executados ou travam de maneiras semelhantes, independentemente da plataforma Threads que você usa. Ou pelo menos essa é a esperança.
Por que não remover completamente as versões de exceções da biblioteca? Existem alguns motivos:
Para permitir que os tamanhos de imagem menores sejam gerados para aplicativos que vinculam estaticamente à biblioteca, a maioria das rotinas foi separada em arquivos individuais de código -fonte.
Isso está sendo feito de maneira a ser compatível com versões anteriores. Os arquivos de origem antigos são reutilizados para congregar os arquivos de rotina individuais em unidades de tradução maiores (por meio de um monte de #includes) para que o compilador ainda possa otimizar sempre que possível, por exemplo, por meio da linha, o que só pode ser feito na mesma unidade de tradução.
Também é possível criar toda a biblioteca compilando o arquivo único chamado "pthread.c", que apenas #inclui todos os arquivos de origem de congregação secundários. O compilador pode ser capaz de usar isso para fazer mais rotinas.
Embora o compilador GNU seja capaz de produzir bibliotecas com a separação necessária (o interruptor -function -segmments), Afaik, o MSVC e outros compiladores não possuem esse recurso.
Finalmente, como eu uso o Makefiles e a Command-Line Compilation, não sei o que essa reorganização pode causar entre os usuários do IDE Project File. Você deve continuar usando seus arquivos de projeto existentes sem modificação.
pthread_num_processors_np ():
Retorna o número de processadores no sistema que estão disponíveis para o processo, conforme determinado a partir da máscara de afinidade do processador.
pthread_timechange_handler_np ():
Para melhorar a tolerância contra o operador ou o serviço de tempo iniciado as alterações do relógio do sistema.
Essa rotina pode ser chamada por um aplicativo quando recebe uma mensagem WM_TIMECHANGE do sistema. Atualmente, transmite todas as variáveis de condição para que os threads de espera possam acordar e reavaliar suas condições e reiniciar suas esperas cronometradas, se necessário.
Como o Win95 não fornece um, a biblioteca agora contém sua própria rotina de intertravamentoComparexChange (), que é usada sempre que o Windows não o fornece. InterligadoCompareexChange () é usado para implementar spinlocks e barreiras, e também em mutexes. Essa rotina depende da instrução da máquina CMPXCHG, que não está disponível nas CPUs i386. Esta biblioteca (do Snapshot 20010712 em diante) não é mais suportada nas plataformas de processador i386.
Apenas para portabilidade do código -fonte - os RWLOCKs ainda não podem ser compartilhados de processo.
pthread_rwlockattr_init()
pthread_rwlockattr_destroy()
pthread_rwlockattr_setpshared()
pthread_rwlockattr_getpshared()
Conforme definido no novo padrão POSIX, e a única especificação Unix versão 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()
[Ainda não para G ++]
Isso foi feito para evitar conflitos.
Handle, DWORD e NULL são temporariamente definidos no pthread.h se ainda não estão.
Não apenas para evitar a necessidade do arquivo pthread.def, mas para melhorar o desempenho. Aparentemente, declarar funções com o DLLIMPORT gera uma chamada direta para a função e evita a sobrecarga de uma chamada de função de stub.
Isso pode ser feito transparente aos aplicativos substituindo as macros que definem as versões atuais de C ++ e SEH de pthread_cleanup_push/pop com a versão C, mas os manipuladores de limpeza Afaik não funcionariam na sequência correta com destruidores e manipuladores de limpeza de exceção quando ocorre uma exceção .
O cancelamento antes iniciado em um thread não pode agora ser inadvertidamente cancelado. Ou seja, uma vez que um encadeamento começa sua execução de cancelamento, o cancelamento está desativado e uma solicitação de cancelamento subsequente retornará um erro (ESRCH).
ERRNO: Uma diretiva incorreta do compilador fez com que uma versão local do errno fosse usada em vez do Win32 Errno. Ambas as instâncias são seguras de threads, mas os aplicativos que verificam o ERRNO depois que uma chamada Pthreads-Win32 estaria errada. A correção disso também corrigiu uma opção de compilador ruim no TestSuite ( /MT deveria ter sido /MD), necessário para vincular -se à biblioteca correta msvcrt.lib.
Para ser adicionado
Para ser adicionado
Novo:
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.
Bugs corrigidos:
MSVC++ C++ exception handling.
Alguns novos testes foram adicionados.
Novo:
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
Bugs corrigidos:
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)
Alguns novos testes foram adicionados.
Bugs corrigidos:
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).
Algumas melhorias de compatibilidade adicionadas, por exemplo.
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)
Alguns novos testes foram adicionados.
Correção de bug - Cancelamento de threads aguardando variáveis de condição agora funciona corretamente (Lorin Hochstein e Peter Slacik)
Cleanup de pilha de exceção corrigida se chamando pthread_exit ()
Corrigidos erros nas variáveis de condição - (Peter Slacik): - Verificações adicionais de contenção - Ajuste corretamente o número de threads de espera após o tempo limite do Condvar cronometrado.
Alguns insetos menores foram corrigidos. Consulte o arquivo Changelog para obter detalhes.
Algumas mais funções POSIX 1B estão agora incluídas, mas o ONY retorne um erro (eNOSYS), se chamado. Eles são:
sem_open
sem_close
sem_unlink
sem_getvalue
Algumas funções POSIX 1B que foram suportadas internamente estão agora disponíveis como funções exportadas:
sem_init
sem_destroy
sem_wait
sem_trywait
sem_post
sched_yield
sched_get_priority_min
sched_get_priority_max
Alguns insetos menores foram corrigidos. Consulte o arquivo Changelog para obter detalhes.
Lançamento inicial.