RedFox20 + Oktonion + WinBuild의 결합된 pthread-win32
포크
PThread https://github.com/WinBuilds/pthread-win32 변경 사항:
이는 pthreads-win32 패키지 버전 2.10.0.0의 포크입니다. 이 포크의 ABI는 원본과 다릅니다.
변경사항:
장기 실행 서버를 용이하게 하기 위해 ptw32_handle_t
의 재사용 카운터 유형이 int
에서 size_t
로 변경되었습니다.
pthread_once_t
에서 사용되지 않는 요소를 제거했습니다.
이 라이브러리는 다른 Visual Studio 2022 프로젝트에서 자주 테스트됩니다.
일반적으로 저는 작업에 MSVC20xx 프로젝트 파일을 사용하고 있습니다. Makefile은 훨씬 덜 자주 사용되었으며 최신 버전이 아닐 수 있습니다.
커밋 메시지 d4b0ef6b에 유의하세요. MSVC2022/2019 프로젝트는 전체적으로 내 내부 설정에 맞게 구성되었지만 귀하의 설정에는 적합하지 않을 수 있습니다.
물론 언제든지 설정을 직접 편집할 수 있지만 많은 vcxproj
프로젝트 파일에 대해 이 작업을 수행해야 하는 경우 작업을 스크립팅하는 것이 좋습니다 . 이러한 종류의 작업을 수행하는 샘플 스크립트는 update-vcxproj.js
및 patch-vcxproj.js
참조하세요. 저는 이를 사용하여 모든 C/C++ 프로젝트가 완전히 동일한 빌드 설정을 갖도록 함으로써 런타임에 예상치 못한 놀라움을 겪지 않도록 합니다. 일부 프로젝트는 약간 다른 디버그/릴리스 정적/DLL 런타임 라이브러리를 사용하여 빌드하기로 결정했기 때문입니다. etc.etc.: 얻을 수 있는 수많은 방법 ?? Windows 환경의 빌드 시스템에서. 재미있는! ?
(2021-12-17)
이것은 대부분 관리 수정 사항이 포함된 마이크로 릴리스입니다.
mkdir b && cd b && cmake -G "Visual Studio 16 2019" ..
: 확인을 사용하여 독립 실행형으로 테스트했습니다. 이는 몇 가지 숨어 있는 버그가 수정되었으며 C 소스가 C++로 조건부 컴파일될 때 CMake 쓰레기(아직도 그 도구가 마음에 들지 않음)에 대한 해결 방법을 포함했음을 의미합니다(pthread-EH.cpp 참조). 및 pthread-JMP.c: 두 개의 새로운 래퍼 소스 파일). 이것은 대부분 관리 수정 사항이 포함된 마이크로 릴리스입니다.
MSVC 및 MinGW64 빌드는 포함된 테스트 제품군과 스트레스 및 벤치 테스트를 완료하여 SMP 아키텍처(Intel x64 Hex Core)에서 테스트되었습니다.
테스트 스위트에 대해 빌드를 실행하십시오. 오류가 발생하면 도구 체인이 오류에 어떻게 기여할 수 있는지 고려해 보세요. 테스트를 성공적으로 통과하는 데 사용한 툴체인 및 테스트 시스템에 대한 자세한 설명은 README 파일을 참조하세요.
64비트 및 32비트 GNU CC 빌드 모두에 대해 MinGW보다 MinGW64를 권장합니다. 왜냐하면 C++ 빌드를 사용한 MinGW DWARF2 예외 처리로 인해 스레드 취소에 일부 문제가 발생하기 때문입니다.
MinGW64에는 또한 사용자가 선호할 수 있는 자체 기본 pthread 구현이 포함되어 있습니다. 라이브러리를 빌드하려면 설치 시 Win32 기본 스레드 옵션을 선택해야 합니다. MinGW64-w32 빌드에는 SJLJ 예외 처리 방법을 선택하는 것이 좋습니다. MinGW64-w64 빌드의 경우 SJLJ 또는 SEH 예외 처리 방법이 작동해야 합니다.
(2018-08-08)
이것은 새로운 주요 릴리스입니다. 주요 버전 증분에는 두 가지 ABI 변경 사항과 함께 응용 프로그램 연결을 다시 컴파일해야 하는 기타 명명 변경 사항과 구성 및 소스 파일의 컴파일 시간 매크로 참조에 대한 일부 텍스트 변경 사항(예: PTW32_*에서 PTW32_로 변경 , ptw32_ 에서 ptw32_*로 변경 등)이 도입됩니다. .
모든 실질적인 관련 기여자의 동의로 pthreads-win32 / pthreads4w 버전 3(4개 파일 제외)은 Apache 라이센스 v2.0의 조건에 따라 릴리스됩니다. APLv2는 GPLv3 및 LGPLv3 라이센스와 호환되므로 이 코드는 GPLv3 및 LGPLv3 프로젝트에 합법적으로 계속 포함될 수 있습니다.
실질적인 관련 기여자는 향후 릴리스에 있는 기능을 구현하는 원본 코드를 기여한 사람으로 정의되었습니다. 더 이상 사용되지 않는 코드에 기여했거나 버그 수정, 심미적 또는 실용적인 목적으로 코드 재구성 또는 빌드 프로세스 개선을 위한 패치를 제공한 여러 기여자는 제외됩니다. 모든 기여자가 연락할 수 있는 것은 아닐 가능성이 있는 상황에서 앞으로 나아가기 위해서는 이러한 구별이 필요했습니다. 모든 기여자는 CONTRIBUTORS 파일에 나열되어 있습니다.
LGPL로 유지되지만 v3으로 변경되는 4개의 파일은 GNU 환경 빌드를 구성하는 데 사용되는 파일입니다.
aclocal.m4
configure.ac
GNUmakefile.in
tests/GNUmakefile.in
이 변경을 요청했거나 협의 시 이에 동의한 기여자는 다음과 같습니다.
pthreads-win32 / pthreads4w 버전 2 릴리스는 LGPL로 유지되지만 버전 2.11 이상은 해당 라이센스의 v3에 따라 릴리스되므로 v2로 백포트된 pthreads4w 버전 3 코드에 대한 추가 사항이 해당 코드를 오염시키지 않습니다.
2011년 2월 26일 이후의 일부 변경 사항은 Windows 2000 이전 시스템과 호환되지 않을 수 있습니다.
2.8.0 이후 모든 릴리스의 새로운 버그 수정은 1.xx 시리즈에 적용되지 않았습니다.
MSVC, MinGW 및 MinGW64 빌드는 포함된 테스트 제품군과 스트레스 및 벤치 테스트를 완료하여 SMP 아키텍처(Intel x64 Hex Core)에서 테스트되었습니다.
테스트 스위트에 대해 빌드를 실행하십시오. 오류가 발생하면 도구 체인이 오류에 어떻게 기여할 수 있는지 고려해 보세요. 테스트를 성공적으로 통과하는 데 사용한 툴체인 및 테스트 시스템에 대한 자세한 설명은 README 파일을 참조하세요.
C++ 빌드를 사용한 MinGW DWARF2 예외 처리로 인해 스레드 취소에 일부 문제가 발생하기 때문에 64비트 및 32비트 GNU CC 빌드 모두에 MinGW보다 MinGW64를 권장합니다.
MinGW64에는 또한 사용자가 선호할 수 있는 자체 기본 pthread 구현이 포함되어 있습니다. 라이브러리를 빌드하려면 설치 시 Win32 기본 스레드 옵션을 선택해야 합니다. MinGW64-w32 빌드에는 SJLJ 예외 처리 방법을 선택하는 것이 좋습니다. MinGW64-w64 빌드의 경우 SJLJ 또는 SEH 예외 처리 방법이 작동해야 합니다.
다음 사항을 제외하면 이번 릴리스는 v2.11.0과 기능이 동일합니다.
이 릴리스에는 라이브러리와 연결되는 애플리케이션에 영향을 미치는 pthread_t 및 pthread_once_t에 대한 변경 사항이 도입되었습니다.
pthread_t: 구조체로 유지되지만 재사용 카운터를 32비트에서 64비트로 확장합니다. 64비트 시스템에서는 개체의 전체 크기가 증가하지 않습니다. 4바이트의 패딩을 효과적으로 사용하여 매우 오랫동안 실행되는 응용 프로그램에서 카운터가 작은 크기에서 사실상 0으로 래핑될 수 있는 위험을 줄입니다. 64비트 재사용 카운터는 위험 없는 런타임을 수개월(평균 스레드 수명이 1ms라고 가정)에서 수세기(평균 스레드 수명이 1ns라고 가정)로 확장합니다.
pthread_once_t: 오랫동안 사용되지 않는 두 요소를 제거하고 크기를 줄입니다.
(2018-08-08)
2.8.0 이후 모든 릴리스의 새로운 버그 수정은 1.xx 시리즈에 적용되지 않았습니다.
2011년 2월 26일 이후의 일부 변경 사항은 Windows 2000 이전 시스템과 호환되지 않을 수 있습니다.
pthreads-win32 / pthreads4w 버전 2.11 및 향후 모든 2.x 버전은 Lesser GNU Public License 버전 3(LGPLv3)에 따라 출시됩니다.
이 소프트웨어의 다음 주요 버전(버전 3)은 Apache 라이센스 버전 2.0(ALv2)에 따라 출시됩니다. LGPLv3에서 2.11을 릴리스하면 이 소프트웨어 버전 3의 수정 사항을 버전 2로 백포트할 수 있습니다. 또한 현재 이 라이브러리를 사용하는 모든 GPL 프로젝트는 프로젝트에서 이 코드의 버전 2 또는 3을 계속 사용할 수 있습니다.
자세한 내용은 https://www.apache.org/licenses/GPL-compatibility.html을 참조하세요.
이 변경 사항과 일관성을 유지하기 위해 이 시점부터 이 라이브러리에 대한 수정은 ALv2의 조건에 따라 이 소프트웨어 버전 3에 대해서만 허용됩니다. 그런 다음 적절한 경우 버전 2로 백포트됩니다.
버전 2.11 출시와 동시에 버전 3도 출시할 예정입니다.
이 버전은 포함된 테스트 제품군과 스트레스 및 벤치 테스트를 완료하여 SMP 아키텍처(Intel x64 Hex Core)에서 테스트되었습니다.
테스트 스위트에 대해 빌드를 실행하십시오. 오류가 발생하면 도구 체인이 오류에 어떻게 기여할 수 있는지 고려해 보세요. 테스트를 성공적으로 통과하는 데 사용한 툴체인 및 테스트 시스템에 대한 자세한 설명은 README 파일을 참조하세요. 64비트 및 32비트 GNU CC 빌드 모두 MinGW32보다 MinGW64를 권장합니다. MinGW64에는 또한 사용자가 선호할 수 있는 자체 독립 pthread 구현이 포함되어 있습니다.
Microsoft 도구 체인 빌드의 경우: (1) 정적 링크를 위해서는 이 라이브러리와 모든 링크 라이브러리 또는 애플리케이션이 모두 /MT를 사용하여 일관되게 컴파일되어야 합니다.
(2) 정적 라이브러리는 DLL 가져오기 라이브러리 pthreadV*.lib와 구별하기 위해 libpthreadV*.lib로 이름이 변경되었습니다.
(3) 혼합 연결을 사용하는 경우(예: 라이브러리의 정적 /MT 버전을 /MD와 연결된 응용 프로그램에 연결) 라이브러리가 errno(_set_errno를 통해)를 두 가지 모두 설정하기 때문에 GetLastError()를 사용하여 오류 코드를 조사할 수 있습니다. ()) 및 SetLastError().
예기치 않은 결과를 초래할 수 있는 헤더에 PTW32_USES_SEPARATE_CRT를 설정하려는 시도를 제거합니다. 특정 상황에서 사용자는 라이브러리나 애플리케이션을 구축할 때 또는 둘 다를 구축할 때 그 효과를 호출하기 위해 자신의 환경에서 명시적으로 정의하기를 원할 수 있습니다. README.NONPORTABLE을 참조하세요. -- 로스 존슨
라이브러리는 완전히 정적으로 연결된 시나리오에서 더욱 안정적이어야 합니다. 참고: PIMAGE_TLS_CALLBACK 코드를 제거하고 모든 컴파일러 버전에서 더 안정적인 것으로 보이는 이전 방법으로 되돌렸습니다.
GNUmakefile에 대한 다양한 수정 사항. 이 파일은 제거되었지만 완전성을 위해 변경 사항은 저장소에 대한 커밋으로 기록되었습니다.
MinGW64-w64는 pid_t를 __int64로 정의합니다. 이제 sched.h가 이를 반영합니다.
부하가 걸린 컴퓨터에서 실패하는 것으로 확인된 여러 테스트가 수정되었습니다. 스레드를 동기화하기 위해 유사한 조잡한 메커니즘을 사용한 다른 테스트(단위 테스트)에는 동일한 개선 사항이 적용되었습니다. semaphore5.c는 sem_destroy가 합법적으로 EBUSY를 반환할 수 있음을 인식합니다. mutex6*.c, mutex7*.c 및 mutex8*.c는 모두 단일 Sleep()을 폴링 루프로 대체했습니다.
(2016-09-18)
2.8.0 이후 모든 릴리스의 새로운 버그 수정은 1.xx 시리즈에 적용되지 않았습니다.
2011-02-26 이후의 일부 변경 사항은 Windows 2000 이전 시스템과 호환되지 않을 수 있습니다.
이 버전은 포함된 테스트 제품군과 스트레스 및 벤치 테스트를 완료하여 SMP 아키텍처(Intel x64 Hex Core)에서 테스트되었습니다.
테스트 스위트에 대해 빌드를 실행하십시오. 오류가 발생하면 도구 체인이 오류에 어떻게 기여할 수 있는지 고려해 보세요. 테스트를 성공적으로 통과하는 데 사용한 툴체인 및 테스트 시스템에 대한 자세한 설명은 README 파일을 참조하세요. 64비트 및 32비트 GNU CC 빌드 모두 MinGW32보다 MinGW64를 권장합니다. MinGW64에는 또한 사용자가 선호할 수 있는 자체 독립 pthread 구현이 포함되어 있습니다.
새 루틴: pthread_timedjoin_np() pthread_tryjoin_np()
sched_getaffinity() sched_setaffinity() pthread_getaffinity_np() pthread_setaffinity_np() pthread_attr_getaffinity_np() pthread_attr_setaffinity_np()
pthread_getname_np() pthread_setname_np() pthread_attr_getname_np() pthread_attr_setname_np()
pthread_win32_getabstime_np()
GNU 컴파일러 환경(MinGW32 및 MinGW64)에는 이제 autoconf를 사용하여 빌드를 자동으로 구성하는 옵션이 있습니다.
빌드: 새로운 makefile 대상이 추가되었으며 기존 대상이 수정되거나 제거되었습니다. 예를 들어, dll 및 정적 라이브러리 모두의 가능한 모든 구성을 빌드하고 테스트하는 대상입니다.
GNU 컴파일러 빌드는 이제 명시적으로 ISO C 및 C++ 2011 표준 호환성을 사용합니다. GNU 컴파일러가 이를 지원하지 않으면 업데이트를 고려하십시오. 이제 '구성' 스크립트를 통해 자동 구성이 가능합니다. 스크립트는 autoconf를 사용하여 생성되어야 합니다. README 파일을 참조하세요. MinGW 프로젝트의 Keith Marshall에게 감사드립니다.
정적 연결: 자동 정적 기능이 dll.c로 이동되었으며 MSVC8 이상을 사용하는 빌드에서 더 이상 앱이 pthread_win32_thread_detach_np()를 호출할 필요가 없도록 확장되었습니다. 즉, 모든 DllMain 기능은 이제 이러한 빌드에 대한 정적 링크에 대해 자동으로 수행됩니다.
일부 nmake 정적 링크 대상이 비활성화되었습니다. TLS 동작 문제로 인해 Makefile의 V*-small-static* nmake 대상이 비활성화되었습니다. 이 문제는 스레드 내부의 pthread_self() 호출이 올바른 POSIX 스레드 핸들을 반환하지 못하고 대신 새로운 "암시적" POSIX 스레드 핸들을 반환하는 테스트/semaphore3.c에 의해 노출됩니다. 암시적 pthread 핸들에는 분리된 스레드 상태가 있으므로 스레드 내부의 pthread_detach() 호출이 EINVAL을 반환하게 됩니다. V*-static* 대상은 영향을 받지 않는 것으로 보입니다. 주요 차이점은 후자가 단일 컴파일 단위에서 생성된다는 것입니다.
이제 작은 개체 파일 정적 링크가 작동합니다(MinGW). 자동 정적 코드가 필요하지만 이 코드를 명시적으로 참조한 것이 없으므로 최적화되었습니다.
sem_getvalue()는 errno를 설정하고 -1을 반환하는 대신 errno 값을 반환할 수 있습니다.
라이브러리가 런타임 라이브러리와 정적으로 링크된 경우 Errno 값이 손실되었습니다. 이는 애플리케이션이 별도의 런타임 인스턴스를 사용했음을 의미합니다. 이는 보다 강력한 오류 상태를 통합할 수 있는 빌드 스위치가 추가된 것을 제외하면 여전히 그렇습니다. 즉, GetLastError()를 통해 반환 코드를 검색할 수 있습니다.
Mingw32에서 오는 GCE(GNU C++) 빌드 구성에 대한 취소 및 pthread_exit()와 관련된 심각한 오류의 원인을 식별했습니다. 이것이 일반적인 것인지 아니면 64비트 시스템에서 실행되는 32비트 라이브러리 및 앱을 빌드할 때에만 해당되는지는 확실하지 않습니다. 64비트 시스템에서 실행되는 Mingw64 32비트 빌드(multilib를 활성화하여 빌드된 GCC)에서는 이러한 오류가 발생하지 않습니다.
릴리스 2.9.x에 도입된 pthread_key_delete() 버그로 인해 테스트 스위트가 감지하지 못하는 방식으로 이 루틴이 실패했습니다. 특히 스레드가 종료되기 전에 소멸자가 있는 키가 삭제되는 경우 이 루틴이 올바르게 작동하는지 확인하기 위해 새로운 테스트가 추가되었습니다.
pthread_win32_process_attach_np()는 QUSEREX.DLL 찾기 및 로드와 관련된 잠재적인 오류/보안을 수정합니다.
_POSIX_THREAD_ATTR_STACKADDR은 이제 pthread.h에서 -1로 설정됩니다. 결과적으로 pthread_attr_setstackaddr()은 이제 ENOSYS를 반환합니다. 이전에는 값이 저장되어 검색할 수 있었지만 그 외에는 사용되지 않았습니다. pthread_attr_getstackaddr()은 그에 따라 ENOSYS를 반환합니다.
pthread_mutex_init()에서 잠재적인 메모리 누수 문제를 해결했습니다. 누수는 뮤텍스 초기화가 실패한 경우에만 발생합니다(매우 드물지만).
라이브러리가 바쁜 대기를 발생시키는 밀리초 미만의 시간 초과를 수정했습니다.
MCS 잠금의 경쟁 조건 및 충돌을 수정합니다. ptw32_mcs_lock_acquire의 대기자 대기열 관리 코드가 ptw32_mcs_lock_release의 대기열 관리 코드와 경쟁하여 분할 오류를 일으켰습니다.
(2012-05-27)
2.8.0 이후 이번 릴리스의 새로운 버그 수정은 1.xx 시리즈에 적용되지 않았습니다.
이 릴리스는 매우 간단한 2.9.0 릴리스를 대체하고 대상 아키텍처 및 빌드 환경을 나타내기 위해 dll에 더 나은 설명 속성을 포함하기 위해 마지막 순간의 비코드 변경 사항을 추가했습니다.
CVS의 2011-02-26 이후 일부 변경 사항은 Windows 2000 이전 시스템과 호환되지 않을 수 있습니다.
이제 "C" 버전 이외의 라이브러리를 사용하는 것은 권장되지 않습니다. 즉, "C++" 버전은 일부 테스트에 실패했으며 추가 기능을 제공하지 않습니다.
이 버전은 포함된 테스트 스위트, 스트레스 및 벤치 테스트를 완료하여 SMP 아키텍처(Intel x64 Hex Core)에서 테스트되었습니다.
이제 DLL 속성에는 대상 아키텍처가 올바르게 포함됩니다. 즉, 탐색기에서 pthreadVC2.dll 파일을 마우스 오른쪽 버튼으로 클릭하고 세부 정보 탭을 선택하면 설명 필드에 컴파일러와 아키텍처가 표시됩니다(예: "MS C x64" 또는 "MS C x86").
이제 Winsock 라이브러리에 대한 종속성은 config.h의 #define RETAIN_WSALASTERROR
통해 임의적으로 결정됩니다. WINCE가 정의되지 않는 한 기본적으로 정의되지 않습니다(나(RJ)가 해당 종속성을 확신하지 못하기 때문입니다).
(MSC 및 GNU 빌드) 정적으로 링크된 라이브러리는 이제 프로그램 시작/종료 시 자동으로 초기화 및 정리됩니다. 즉, 정적으로 링크된 애플리케이션은 pthread_win32_process_attach_np() 및 pthread_win32_process_detach_np() 루틴을 명시적으로 호출할 필요가 없습니다. 스레드별 루틴 pthread_win32_thread_detach_np()는 프로그램 종료 시 호출되어 기본 Windows 기본 스레드에서 획득한 POSIX 리소스를 정리합니다(RJ)가 프로세스를 올바르게 이해하는 경우. POSIX API 루틴을 호출하는 다른 Windows 네이티브 스레드는 애플리케이션이 회수된 POSIX 리소스에 의존하거나 POSIX TSD(TLS) 소멸자를 실행하는 경우 스레드 종료 시 스레드 분리 루틴을 호출해야 할 수도 있습니다. 이러한 루틴에 대한 설명은 README.NONPORTABLE을 참조하세요.
강력한 뮤텍스는 PROCESS_PRIVATE 범위 내에서 구현됩니다. pthread_mutex_* 함수는 일반적인 사용에서와는 강력한 뮤텍스에 대해 다른 오류 코드를 반환할 수 있습니다. 예를 들어 pthread_mutex_unlock은 뮤텍스가 강력할 때 모든 뮤텍스 유형에 대한 소유권을 확인하는 데 필요하지만 "정상"이 아닌 경우에는 이러한 오류가 발생하지 않습니다. 강력한 뮤텍스 유형.
pthread_getunique_np는 일부 다른 구현과의 소스 수준 호환성을 위해 구현됩니다. 이 루틴은 스레드와 고유하게 연결된 64비트 시퀀스 번호를 반환합니다. POSIX 스레드 핸들을 주문하거나 해시하기 위해 애플리케이션에서 사용할 수 있습니다.
64비트 시스템에 대한 더 많은 변경 사항.
WinCE용 빌드 및 테스트를 위한 다양한 수정 및 수정 사항입니다.
pthread_cond_destroy() 수정 - 취소 지점이 아니어야 합니다. 기타 사소한 빌드 문제가 해결되었습니다.
pthread_cond_destroy()에서 잠재적 교착 상태를 제거합니다.
Win64용 빌드 및 테스트를 위한 다양한 수정.
QueueUserAPCEx 비동기 취소 도우미 DLL(별도 다운로드)에 대한 다양한 수정 사항 및 pthread 코드 정리.
잠재적인 NULL 포인터 참조를 제거했습니다.
애플리케이션이 pthread_barrier_wait를 호출하는 스레드 수를 장벽 수로만 제한해야 한다는 요구 사항을 제거했습니다. 또한 Barrier_wait와 Barrier_destroy 간의 경합이 감소했습니다. 이 변경으로 인해 장벽의 속도가 약간 느려지지만 장벽당 소비되는 세마포어 수가 1개로 절반으로 줄어듭니다.
sched_[gs]etscheduler의 핸들 누수 문제를 수정했습니다.
pthread.h에서 모든 POSIX 재진입 함수 호환성 매크로를 제거했습니다. 일부는 단순히 의미상 정확하지 않았습니다.
스레드는 더 이상 스레드 범위 외부에서 포착되지 않은 예외를 전달하려고 시도하지 않습니다(C++ 및 SEH 빌드에만 해당). 포착되지 않은 예외로 인해 스레드가 반환 코드 PTHREAD_CANCELED와 함께 종료됩니다.
특히 x64에 대한 많은 캐스팅 수정, x64에 대한 연동 수정 및 재작업이 이루어졌습니다.
이제 Winsock 라이브러리에 대한 종속성은 config.h의 #define RETAIN_WSALASTERROR
통해 임의적으로 결정됩니다. WINCE가 정의되지 않는 한 기본적으로 정의되지 않습니다(RJ가 해당 종속성을 확신하지 못하기 때문).
내부 관리에 사용되는 여러 정적 POSIX 뮤텍스는 리소스 소비, 특히 Win32 개체 사용을 줄이기 위해 MCS 대기열 기반 잠금으로 대체되었습니다.
보안을 위해 QuserEx.dll을 사용하는 경우 이제 Windows 시스템 폴더에 설치해야 합니다.
강력한[1-5].c - 강력한 뮤텍스 시퀀스1.c - 스레드별 고유 시퀀스 번호
모든 mutex*.c 테스트는 동일한 조건에서 강력한 뮤텍스를 테스트하도록 적절하게 수정되었습니다. 적절한 경우 benchtest*.c에 강력한 뮤텍스 벤치테스트를 추가했습니다.
(2006-12-22)
2.7.0 이후 이번 릴리스의 새로운 버그 수정은 버전 1.xx 시리즈에는 적용되지 않았습니다. 이제 버전 1을 내려놓을 때가 된 것 같습니다.
이 릴리스는 아직 SMP 아키텍처에서 테스트되지 않았습니다. 모든 테스트는 단일 프로세서 시스템에서 통과됩니다.
Sem_destroy는 세마포어를 기다리고 있는 스레드가 없더라도 EBUSY를 반환할 수 있습니다. (내부적으로) 세마포어 구조체를 무효화하는 것과 관련된 다른 경합도 제거되었습니다.
semaphore5.c - 위에 언급된 버그 수정을 테스트합니다.
(2005-06-04)
pthread_once에 MCS 잠금을 통합하는 것을 포함하여 이 릴리스의 모든 새로운 기능은 릴리스 1.11.0에서 백포팅되었습니다. 그러나 버전 1과 2는 성능과 기능이 동일하더라도 여전히 호환되지 않습니다.
이 릴리스는 단일 프로세서 및 다중 프로세서 시스템 모두에서 테스트되었습니다(테스트 제품군 통과).
Pthread_once는 우선순위 부스팅 및 기타 복잡성을 제거하여 견고성을 향상시키기 위해 다시 구현되었습니다. 재활용 고유가 아닌 Win32 핸들에 대한 레이스가 제거되었습니다. pthread_once의 일반적인 형식은 이제 Alexander Terekhov가 이전에 제안한 것과 동일하지만 '명명된 뮤텍스' 대신 동적 자체 초기화 및 파괴에 필요한 속성을 가진 대기열 기반 잠금이 구현되었습니다. 이 잠금 장치도 효율적입니다. pthread_once_t의 크기와 PTHREAD_ONCE_INIT의 크기가 변하지 않은 만큼 ABI는 영향을 받지 않습니다. 그러나 불투명해야 하는 pthread_once_t 내부를 엿보는 애플리케이션은 중단됩니다.
(2005-05-19)
이번 릴리스의 모든 버그 수정과 새로운 기능은 릴리스 1.10.0에서 백포트되었습니다.
이 릴리스는 단일 프로세서 및 다중 프로세서 시스템 모두에서 테스트되었습니다(테스트 제품군 통과). MP 테스트를 철저하게 실행하고 결함이 감지될 때 중요한 관찰 및 데이터를 제공한 TomoTherapy의 Tim Theisen에게 감사드립니다.
(2005-05-09)
이제 패키지에는 pthreads-win32와의 일관성을 위해 편집된 HTML 형식의 Unix 스타일 매뉴얼 페이지로 구성된 참조 문서 세트가 포함되어 있습니다. 이 세트는 http://sources.redhat.com/pthreads-win32/manual/index.html에서 온라인으로 읽을 수도 있습니다.
MP 시스템에서 시험판 테스트 스위트를 실행해 준 Tim Theisen에게 다시 한 번 감사드립니다.
이번 릴리스의 모든 버그 수정과 새로운 기능은 릴리스 1.9.0에서 백포트되었습니다.
수정된 구현에서는 문제가 있는 HANDLE이 필요하지 않으며 키가 삭제되거나 스레드가 종료되는 즉시 메모리를 회수합니다.
누출을 식별하고 찾아낸 Aculab의 Richard Hughes에게 감사드립니다.
TSD 키 소멸자는 이제 한 번이 아닌 최대 PTHREAD_DESTRUCTOR_ITERATIONS 번까지 처리됩니다. PTHREAD_DESTRUCTOR_ITERATIONS는 한동안 pthread.h에 정의되었지만 사용되지 않았습니다.
sem_post/sem_post_multiple과 sem_wait 취소 사이의 세마포어 회계 경쟁을 수정합니다. 이는 마지막 릴리스에서 수정된 sem_timedwait와 동일한 문제입니다.
sem_init, sem_post 및 sem_post_multiple은 이제 세마포어 수가 _POSIX_SEM_VALUE_MAX를 초과하지 않는지 확인합니다.
sigwait()는 무작동(no-op)에 지나지 않지만 표준과 일치하려면 최소한 취소 지점이어야 합니다.
스트레스1.c - 조건 변수 및 세마포 시간 제한 대기 논리의 문제를 노출하려고 시도합니다. 이 테스트는 마지막 릴리스의 sem_timedwait 버그를 식별하는 데 사용된 Stephan Mueller의 샘플 테스트 코드에서 영감을 받았습니다. 실행하는 데 시간이 걸릴 수 있으므로 일반 테스트 모음의 일부가 아닙니다. 실행하려면: nmake clean VC-stress
tsd2.c - 소멸자 루틴이 실행된 후 tsd 키 값이 NULL이 아닌 경우 키 소멸자가 다시 실행되는지 테스트합니다. 또한 pthread_set특이적() 및 pthread_get특이적()이 소멸자에서 호출 가능한지 테스트합니다.
(2005-04-26)
현재 pthread_once()의 문제를 해결하기 위해 버전 3.0.0을 출시할 계획은 없습니다. pthread_once의 다른 가능한 구현은 현재 구현의 복잡성을 줄이기 위한 시도로 향후 릴리스에서 계속 조사될 것입니다.
이번 릴리스의 모든 버그 수정 및 새로운 기능은 릴리스 1.8.0에 대해 백포트되었습니다.
pthread_once 경주를 수정했습니다(MP 시스템의 실패). 다양한 컴파일러를 사용하여 MP 시스템에서 철저한 사전 출시 테스트를 실행한 Tim Theisen에게 감사드립니다. VC++ 6 VC++ 7.1 Intel C++ 버전 8.0 모든 테스트를 통과했습니다. 일부 사소한 속도 개선도 이루어졌습니다.
pthread_mutex_timedlock()의 정수 오버런 오류 수정 - sem_timedwait()가 릴리스 2.2.0에서 수정되었을 때 누락되었습니다. NEED_SEM이 정의되면 이 루틴은 더 이상 ENOTSUP을 반환하지 않습니다. 지원됩니다(NEED_SEM은 3.0 이전 WinCE 버전에만 필요함).
sem_timedwait()의 시간 초과 버그를 수정했습니다.
NEED_SEM 조건부 포함 코드의 여러 문제를 수정합니다. NEED_SEM 포함 코드는 버전 3.0 이전의 WinCE와 같이 W32 세마포어를 구현하지 않는 시스템에 제공됩니다. POSIX 세마포어의 대체 구현은 NEED_SEM이 정의된 경우 이러한 시스템에 대한 W32 이벤트를 사용하여 구축됩니다. 이 코드는 이번 릴리스에서 완전히 다시 작성되어 대부분의 기본 POSIX 세마포어 코드를 재사용하고 특히 pthreads-win32에서 지원하는 모든 sem_* 루틴을 구현합니다. Tim Theisen은 또한 자신의 MP 시스템에서 NEED_SEM 코드에 대해 테스트 스위트를 실행했습니다. 모든 테스트가 통과되었습니다.
이제 라이브러리는 Borland Builder 5.5 컴파일러에 대해 오류 없이 빌드됩니다.
pthread_once는 너무 복잡하지만 테스트에서 확인할 수 있는 한 작동합니다.
Borland 버전의 dll은 메모리 읽기 예외로 인해 일부 테스트에 실패했습니다. 원인은 아직 알려지지 않았지만 컴파일러 버그도 배제되지 않았습니다.
(2005-04-12)
릴리스 1.7.0은 이 릴리스의 새로운 기능과 버그 수정이 포함된 백포트입니다. 릴리스 2.0.0/일반의 이전 참고 사항을 참조하십시오.
(2005-04-04)
라이브러리의 정적 링크 버전을 빌드하기 위해 makefile 대상을 추가했습니다. MinGW와 MSVC 모두. 이는 LGPL 라이센스에 대한 변경을 의미하지 않으며 이 라이브러리와 정적으로 링크된 소프트웨어 배포에 대한 특정 조건을 여전히 부과합니다.
pthread_once()에는 알려진 버그가 있습니다. init_routine을 취소하면 대기 중인 스레드가 초기화 스레드보다 우선순위가 높은 경우 잠재적인 기아(즉, 교착 상태) 문제가 노출됩니다. 이 문제는 라이브러리 버전 3.0.0에서 수정될 예정입니다.
sem_timedwait()의 정수 오버런 오류를 수정합니다. 케빈 루시에
정적 연결을 위한 전처리기 지시문을 수정합니다. 디미타르 파나요토프
(2005-03-16)
(2005-03-16)
이 릴리스는 ABI 변경 사항을 나타내며 DLL 버전 이름이 1에서 2로 증가했습니다(예: pthreadVC2.dll).
버전 1.4.0은 이 릴리스에 포함된 새로운 기능을 백포트합니다. pthreads-win32 버전 1.xx를 기반으로 구축된 애플리케이션에 대한 업데이트를 사용하여 해당 버전에서 구축된 DLL을 배포하십시오.
패키지 이름이 변경되어 스냅샷 날짜가 버전 번호 + 설명 정보로 대체되었습니다. 예를 들어 이 릴리스는 "pthreads-win32-2-0-0-release"입니다.
버전 1.3.0
버전 1.2.0
버전 1.1.0
버전 1.0.0
이 스냅 샷은 주로 Snapshot-2004-11-03에 도입 된 Condvar 버그를 수정합니다. DLL 버전화는 또한 런타임에 대한 애플리케이션이 Microsoft 호환 DLL 버전 정보를 점검하고 ABI 및 주요 (백 워드 호환) API 변경을위한 DLL 명명 시스템을 확장하도록 포함되었습니다. 자세한 내용은 readme 파일을 참조하십시오.
런타임에서 DLL 호환성을 확인하려는 응용 프로그램을 위해 DLL에 Microsoft 스타일 버전 리소스가 추가되었습니다.
PTHREADS-WIN32 DLL 이름 지정은 동일한 파일 시스템에서 호환되지 않는 DLL 버전이 공존 할 수 있도록 확장되었습니다. 자세한 내용은 readme 파일을 참조하십시오. 간단히 말하십시오. DLL 내부의 버전 정보는 지금부터 각 릴리스마다 변경되지만 DLL 버전 이름은 새 DLL이 이전 응용 프로그램과 호환되지 않는 경우에만 변경됩니다.
버전 관리 체계는 GNU Libtool에서 빌려 왔으며 DLL 명명 체계는 Cygwin에서 나온 것입니다. Libtool 스타일 번호 매기기 규칙이 존중되면 Cygwin DLL 명명 체계는 자동으로 DLL 이름 변경이 최소화되고 응용 프로그램이 호환되지 않는 PTHREADS-WIN32 DLL을로드하지 않도록합니다.
사전 제작 된 DLL을 사용하는 사람들은이 스냅 샷에 DLL/LIB 이름에 새로운 접미사 (1)가 있음을 알게 될 것입니다. 예 : pthreadvc1.dll 등
특정 POSIX 매크로가 변경되었습니다.
이러한 변경 사항은 단일 UNIX 사양 버전 3을 준수하기위한 것인데,이 버전은 0 (0)으로 설정되었거나 정의되지 않은 경우 응용 프로그램은 SYSCONF ()를 사용하여 런타임시 값을 결정할 수 있습니다. PTHREADS-WIN32는 SYSCONF ()를 구현하지 않습니다.
다음 매크로는 더 이상 정의되지 않았지만 정의되어 -1로 설정되어 있습니다 (구현되지 않음).
_POSIX_THREAD_ATTR_STACKADDR
_POSIX_THREAD_PRIO_INHERIT
_POSIX_THREAD_PRIO_PROTECT
_POSIX_THREAD_PROCESS_SHARED
다음 매크로가 정의되어 200112L (구현)으로 설정됩니다.
_POSIX_THREADS
_POSIX_THREAD_SAFE_FUNCTIONS
_POSIX_THREAD_ATTR_STACKSIZE
_POSIX_THREAD_PRIORITY_SCHEDULING
_POSIX_SEMAPHORES
_POSIX_READER_WRITER_LOCKS
_POSIX_SPIN_LOCKS
_POSIX_BARRIERS
다음 매크로가 정의되어 적절한 값으로 설정됩니다.
_POSIX_THREAD_THREADS_MAX
_POSIX_SEM_VALUE_MAX
_POSIX_SEM_NSEMS_MAX
PTHREAD_DESTRUCTOR_ITERATIONS
PTHREAD_KEYS_MAX
PTHREAD_STACK_MIN
PTHREAD_THREADS_MAX
이 스냅 샷에서 생성 된 DLL은 PTHREAD_T로 변경하여 고유 한 POSIX 스레드 ID를 제공하기 때문에 응용 프로그램을 다시 컴파일하지 않고 이전 응용 프로그램에서 사용할 수 없습니다.
이 스냅 샷은 확장 테스트 스위트를 통과하지만 많은 변경 사항이 상당히 중요하며 일부 응용 프로그램은 이전과는 다른 동작을 보여줄 수 있으므로주의해서 채택 할 수 있습니다. 바라건대, 변화된 행동은 도서관이 직장에서 더 나은 도서관이 더 나쁘지 않기 때문입니다.
pthread_create ()는 더 이상 실 참조 Arg로 null을 허용하지 않습니다. segfault (메모리 액세스 오류)가 발생하고 스레드가 생성되지 않습니다.
pthread_barrier_wait ()는 더 이상 취소 지점 역할을하지 않습니다.
pthread_once ()에서 잠재적 인 레이스 조건 수정
호환성을 위해 추가 : pthread_recursive_mutex_initializer, pthread_errorcheck_mutex_initializer, pthread_recursive_mutex_initializer_np, pthread_errorcheck_mutex_initializer_np
디지털 화성 컴파일러에 대한 초기 지원
더 빠른 뮤 테스. 알렉산더 테레 코프 (Alexander Terekhov)가 제공하는 모델에 따라 커널 우주 검사를 줄이고 시간 내 만료와 잠금 해제 사이의 레이스를 관리하는 데 사용되는 몇 가지 추가 중요한 섹션을 제거합니다. 새로운 뮤텍스는 뮤 테스의 엄격한 절대 FIFO 스케줄링을 시행하지 않지만, 주문 외부 잠금 획득은 매우 드물어야합니다.
더 빠른 세마포어. 위의 Mutxes와 유사한 모델에 따라 예비 사용자 우주 검사를 사용하도록 다시 작성되었습니다.
sem_getValue ()는 이제 웨이터 수를 반환합니다.
Posix 스레드 ID는 이제 훨씬 더 강력한 독창성 특성을 가지고 있습니다. 도서관은 적어도 2^(Wordsize) 스레드 파괴/생성 사이클에 대해 동일한 스레드 ID를 재사용하지 않도록합니다.
semaphore4.c : 새로운 SEM_WAIT ()의 취소 테스트.
semaphore4t.c : sem_timedwait ()의 경우와 마찬가지로.
RWLOCK8.C : R/W 잠금의 느린 실행 경로와 CVS, 뮤트 및 세마포어의 느린 실행 경로를 테스트하고 횟수.
라이브러리를 구축 할 수있는 컴파일 목록에 Watcom을 추가하십시오. 이는 비틀기 인식 Errno로 인해 결국 실패했습니다. 라이브러리가 구축되지만 테스트 스위트는 실패합니다. 자세한 내용은 readme.watcom을 참조하십시오.
참고 : 애플리케이션에서 Async 취소를 사용하지 않거나 네트워크 I/O와 같은 시스템 리소스에서 차단 된 스레드를 취소 할 필요가없는 경우 기본 비 배열 비동기 취소가 충분할 수 있습니다. 그러나 PTHREADS-WIN32는 런타임에 이러한 구성 요소의 가용성을 자동화하므로 나중에 마음을 바꾸면 소스에서 라이브러리를 재건 할 필요가 없습니다.
모든 애플리케이션에서 비동기 취소를 사용하는 바람직하지 않은 책과 다른 곳에서 이용할 수있는 모든 조언은 여전히 존재하지만,이 기능은 라이브러리의 POSIX 표준에 따른 환영의 추가 기능입니다.
스레드 우선 순위 관리의 정리. 특히, 스레드 우선 순위 설정은 이제 sched_get_priority_min/max ()에 의해 반환 된 범위 내에서 유효하지 않은 Win32 값을 유용한 값으로 매핑하려고 시도합니다. "스레드 우선 순위"에서 README.NONNONTOBLE를 참조하십시오.
pthread_getschedparam ()은 이제 표준에 의해 필요한대로 pthread_setschedparam ()에 대한 가장 최근의 호출에 의해 주어진 우선 순위를 반환합니다. 이전에는 PTHREAD_GETSCHEDPARAM ()이 통화 당시 실행중인 스레드 우선 순위를 잘못 반환했으며, 이는 조정되거나 일시적으로 홍보/강등 될 수 있습니다.
sched_get_priority_min () 및 sched_get_priority_max () 이제 오류에서 -1을 반환하고 errno를 설정하십시오. 이전에는 오류 값을 직접 반환했습니다.
pthread_self ()는 재활용 대신 Dupyclandle이 실패한 경우 새로 생성 된 암시 적 Posix 스레드 핸들을 제거합니다 (매우 가능성은 거의 없습니다.
pthread_exit ()는 암시 적 Posix 스레드를 위해 Posix 스레드 구조물을 제거하거나 재활용하지 않았습니다.
John Bossom의 원래 구현 이후, 라이브러리는 비 포스 초기 스레드 (Win32 스레드)가 Pthreads-Win32 루틴을 호출하여 POSIX 스레드와 상호 작용할 수 있도록 허용했습니다. 이는 일단 생성 된 Win32 스레드에 대한 Fly Posix 스레드 ID를 작성하여 완전한 상호 상호 작용을 허용함으로써 수행됩니다. 이것은 나사산 취소 (비동기 또는 연기)로 확장되지 않았습니다. 이제 그다.
이전 스레드의 posix pthread_t 값이 알려진 경우 다른 스레드 (Win32 또는 Posix)에서 모든 스레드를 취소 할 수 있습니다. TSD 소멸자이며 PTHREAD_CANCELED의 종료 코드 (getExitCodeThread ()로 검색 됨)로 스레드가 종료되기 전에 TSD Destructors이며 POSIX 정리 처리기가 실행됩니다.
이를 통해 PTHREAD_COND_WAIT () 취소 가능성 및 청소 처리기 (PTHREAD_COND_WAIT ()는 POSIX 취소 지점)와 동일한 방식으로 POSIX CV 루틴을 호출 할 수 있습니다.
취소를 추가하여 Win32 스레드는 이제 세마포어, 뮤트, 조건 변수, 읽기/쓰기 잠금, 장벽, 스핀 락, TSD, 정리 푸시/팝, 취소, pthread_exit, 스케줄링 등 .
이 날짜의 '암시 적'POSIX 스레드 ID는 지연된 취소 유형과 분리 된 (결합 할 수 없음)로 초기화됩니다. POSIX 스레드 ID는 POSIX 핸들이 필요한 모든 POSIX 루틴에 의해 자동으로 생성됩니다 (루틴에 PTHREAD_T가 파라미터로 필요하지 않은 한). Win32 스레드는 pthread_self ()를 호출하여 자체 Posix 스레드 ID를 발견 할 수 있으며, 필요한 경우 핸들을 생성하고 pthread_t 값을 반환합니다.
위의 새로운 기능을 테스트하십시오.
이 스냅 샷은 새로운 테스트 케이스 소스에 대한 우발적 인 부패를 수정합니다. 라이브러리 소스 코드에는 변경 사항이 없습니다.
Arg 점검을 조이고 Mingw32 및 MSYSDTK의 이후 버전에서 작업하기위한 다양한 변경 사항.
pthread_getschedparam () 등, 고정 위험 스레드 유효성 검사.
SEM_TIMEDEDWAIT ()는 이제 불합리한 삼기 값에 대해 더 세게 점검을 사용하여 예상치 못한 시간 초과 값을 초래할 수 있습니다.
PTW32_COND_WAIT_CLEANUP ()는 더 이상 CV 신호를 신비롭게 소비하지 않지만 더 많은 가짜 웨이크 업을 생성 할 수 있습니다. SEM_TIMEDEDWAIT () 호출은 CV 신호를 소비한다고 믿어집니다.
암시 적 스레드에 대해 PTW32_THREADDESTROY ()의 메모리 누출을 수정했습니다.
pthread_cond_destroy ()에서 교착 상태에 대한 고정 된 잠재력. 한 스레드가 조건 변수를 파괴하려고 시도하는 동안 다른 스레드가 동적으로 초기화하려고 시도 할 때 정적으로 선언 된 CVS (pthread_cond_initializer)의 경우 교착 상태가 발생할 수 있습니다.
이전에 정의되지 않은 경우 클린업 스타일은 컴파일러/언어에서 자동으로 결정되었으며 다음 중 하나는 다음과 같이 정의되었습니다.
PTW32_CLEANUP_SEH MSVC only
PTW32_CLEANUP_CXX C++, including MSVC++, GNU G++
PTW32_CLEANUP_C C, including GNU GCC, not MSVC
이러한 정의는 정의 된 정리 스타일 (Pthread.h 참조)을 결정하고 가장 중요한 것은 PTHREAD_EXIT를 통해 취소 및 스레드 출구가 수행되는 방식을 수행합니다 (private.c의 루틴 PTW32_THROW () 참조).
요컨대, 라이브러리의 예외 버전은 스레드가 취소되거나 종료 될 때 예외를 던지고 (pthread_exit ()를 통해) 스레드 시작 루틴의 핸들러에 의해 잡히므로 올바른 스택 풀이가 어디에 있든 관계없이 발생합니다. 스레드는 pthread_exit ()를 통해 취소되거나 종료 될 때입니다.
이 스냅 샷과 미래의 스냅 샷에서 빌드가 명시 적으로 정의되지 않는 한 (예 : 컴파일러 옵션을 통해) ptw32_cleanup_seh, ptw32_cleanup_cxx 또는 ptw32_cleanup_c이라도 이제 빌드는 항상 ptw32_cleanup_c 스타일의 정리에 기본값을 얻습니다. 이 스타일은 취소 및 pthread_exit 구현에서 setjmp/longjmp를 사용하므로 응용 프로그램이있는 응용 프로그램 (예 : C ++ 앱)에 링크 된 경우에도 스택이 풀리지 않습니다. 이는 대부분의 현재 상업용 UNIX POSIX 스레드 구현과 일관성을위한 것입니다. Compaq의 Tru64는 예외 (말장난 의도가 없음) 및 가능한 미래 추세 일 수 있습니다.
이전에는 명확하게 문서화되지 않았지만 링크 된 라이브러리 버전에 사용 된 동일한 PTW32_CLEANUP_* DEFINE를 사용하여 응용 프로그램을 구축해야합니다. 즉, 가능한 정의에는 다음 라이브러리 버전이 필요합니다.
PTW32_CLEANUP_SEH pthreadVSE.dll
PTW32_CLEANUP_CXX pthreadVCE.dll or pthreadGCE.dll
PTW32_CLEANUP_C pthreadVC.dll or pthreadGC.dll
예를 들어 앱이 C 또는 C ++인지 여부에 관계없이 pthreadvc.lib 또는 libpthreadgc.a와 연결하면 ptw32_cleanup_c를 정의해야합니다.
이 모든 것의 요점은 다음과 같습니다.이 중 하나를 명시 적으로 정의하지 않은 경우이 섹션의 상단에 설명 된 기본값이 사용되었습니다.
위에서 설명한대로 이것은 이제 변경되었지만 여기에서 더 명확하게하려고 시도합니다. 예는 다음과 같습니다.
C ++ 예외를 사용하여 MSVC ++ IE를 사용하여 응용 프로그램을 구축하고 PTW32_Cleanup_*중 하나를 명시 적으로 정의하지 않으면 PTW32_CLEANUP_C ++가 PTHREAD.H에서 자동으로 정의되었습니다. 당신은 pthreadvce.dll과 연결되어 있어야합니다.
이제 이전과 같이 응용 프로그램을 구축 한 경우 Pthread.h는 이제 PTW32_CLEANUP_C를 기본 스타일로 자동으로 설정하고 PTHREADVC.DLL과 링크해야합니다. 스레드가 취소되거나 스레드가 pthread_exit ()을 호출 할 때 스택 풀기가 발생하지 않습니다.
귀하의 응용 프로그램은 이제 이전 버전과 비활성화되지 않은 방식으로 다르게 행동 할 것입니다. 아마도 스레드가 취소 된 후 국부적으로 인스턴스화 된 물체가 파괴되거나 청소되지 않을 수 있습니다.
이전과 동일한 동작을 원한다면 이제 컴파일러 옵션을 사용하여 ptw32_cleanup_c ++를 명시 적으로 정의하고 이전과 마찬가지로 pthreadvce.dll과 링크해야합니다.
기본 스타일을 예외 친화적으로 덜 만드는 이유는 무엇입니까? 상용 UNIX POSIX 스레드 구현을 사용하면 스택 풀기를 선택할 수 있습니다. 따라서 PTHREAD-WIN32에서 기본값으로 제공하는 것은 위험합니다. 우리는 여전히 선택을 제공하지만 의식적으로 달리 수행하기로 선택하지 않는 한, PTHREADS 응용 프로그램은 이제 사용하는 스레드 플랫폼에 관계없이 비슷한 방식으로 실행되거나 충돌합니다. 아니면 적어도 이것은 희망입니다.
라이브러리의 예외 버전을 완전히 제거하지 않겠습니까? 몇 가지 이유가 있습니다.
라이브러리와 정적으로 연결되는 응용 프로그램에 대해 더 작은 이미지 크기를 생성 할 수 있도록 대부분의 루틴은 개별 소스 코드 파일로 분리되었습니다.
이것은 뒤로 호환되는 방식으로 수행되고 있습니다. 기존 소스 파일은 개별 루틴 파일을 더 큰 번역 장치 (#includes를 통해)로 모여서 재사용하여 컴파일러가 가능한 한 어디에나도 최적화 할 수 있도록 동일한 변환 단위 내에서만 수행 할 수 있습니다.
"pthread.c"라는 단일 파일을 컴파일하여 전체 라이브러리를 작성할 수도 있습니다. 컴파일러는 이것을 사용하여 더 많은 루틴을 수행 할 수 있습니다.
GNU 컴파일러는 필요한 분리 (-ffunction -segments switch)가있는 라이브러리를 생성 할 수 있지만 Afaik, MSVC 및 기타 컴파일러에는이 기능이 없습니다.
마지막으로, makefiles와 명령 줄 컴파일을 사용하기 때문에,이 재구성이 IDE 프로젝트 파일 사용자들 사이에서 어떤 혼란을 일으킬 수 있는지 모르겠습니다. 수정없이 기존 프로젝트 파일을 계속 사용할 수 있어야합니다.
pthread_num_processors_np () :
프로세서 선호도 마스크에서 결정된대로 프로세스에서 사용할 수있는 시스템의 프로세서 수를 반환합니다.
pthread_timechange_handler_np () :
운영자 또는 시간 서비스에 대한 공차를 개선하기 위해 시스템 시계 변경이 시작되었습니다.
이 루틴은 시스템에서 WM_TIMECHANGE 메시지를받을 때 응용 프로그램에서 호출 할 수 있습니다. 현재 모든 조건 변수를 방송하여 대기 실이 깨어나서 조건을 재평가하고 필요한 경우 시간 대기 대기를 다시 시작할 수 있습니다.
Win95는 하나를 제공하지 않기 때문에 라이브러리에는 이제 Windows가 제공하지 않을 때마다 사용되는 자체 인터록드 Compareexchange () 루틴이 포함되어 있습니다. InterlockedCompareexchange ()는 스핀 록 및 장벽을 구현하는 데 사용됩니다. 이 루틴은 i386 CPU에서 사용할 수없는 CMPXCHG 머신 명령어에 의존합니다. 따라서이 라이브러리 (Snapshot 20010712 이후)는 더 이상 i386 프로세서 플랫폼에서 지원되지 않습니다.
소스 코드 이식성의 경우 -RWLOCKS는 아직 공유 할 수 없습니다.
pthread_rwlockattr_init()
pthread_rwlockattr_destroy()
pthread_rwlockattr_setpshared()
pthread_rwlockattr_getpshared()
새로운 POSIX 표준 및 단일 UNIX 사양 버전 3에 정의 된대로 :
sem_timedwait()
pthread_mutex_timedlock() - Alexander Terekhov and Thomas Pfaff
pthread_rwlock_timedrdlock() - adapted from pthread_rwlock_rdlock()
pthread_rwlock_timedwrlock() - adapted from pthread_rwlock_wrlock()
[아직 G ++의 경우]
이것은 갈등을 방지하기 위해 수행되었습니다.
손잡이, dword 및 null은 pthread.h 내에서 일시적으로 정의됩니다.
pthread.def 파일의 필요성을 피할뿐만 아니라 성능을 향상시킵니다. 분명히 Dllimport로 기능을 선언하면 기능에 대한 직접 호출을 생성하고 스터브 함수 호출의 오버 헤드를 피합니다.
이것은 현재 C ++ 및 SEH 버전의 PTHREAD_CLEANUP_PUSH/POP를 C 버전으로 정의하는 매크로를 대체하여 응용 프로그램에 투명하게 만들 수 있지만, AFAIK 정리 핸들러는 예외가 발생할 때 Destructors 및 Exception Cleanup 처리기와 함께 올바른 시퀀스로 실행되지 않습니다. .
스레드에서 시작된 일단 취소는 이제 우연히 두 배의 취소 될 수 없습니다. 즉, 스레드가 시작되면 취소 실행이 시작되면 취소가 비활성화되고 후속 취소 요청이 오류 (ESRCH)를 반환합니다.
Errno : 잘못된 컴파일러 지시문으로 인해 Win32 Errno 대신 로컬 버전의 Errno가 사용되었습니다. 두 인스턴스 모두 스레드 안전이지만 PTHREADS-WIN32 호출 후 ERRNO를 확인하는 응용 프로그램이 잘못됩니다. 이 문제를 해결하면 올바른 라이브러리 MSVCRT.LIB와 연결하는 데 필요한 시험소 ( /MT가 /md)에서 잘못된 컴파일러 옵션을 수정했습니다.
추가 예정
추가 예정
새로운:
Renamed DLL and LIB files:
pthreadVSE.dll (MS VC++/Structured EH)
pthreadVSE.lib
pthreadVCE.dll (MS VC++/C++ EH)
pthreadVCE.lib
pthreadGCE.dll (GNU G++/C++ EH)
libpthreadw32.a
Both your application and the pthread dll should use the
same exception handling scheme.
버그 수정 :
MSVC++ C++ exception handling.
일부 새로운 테스트가 추가되었습니다.
새로운:
asynchronous cancellation on X86 (Jason Nye)
Makefile compatible with MS nmake to replace
buildlib.bat
GNUmakefile for Mingw32
tests/Makefile for MS nmake replaces runall.bat
tests/GNUmakefile for Mingw32
버그 수정 :
kernel32 load/free problem
attempt to hide internel exceptions from application
exception handlers (__try/__except and try/catch blocks)
Win32 thread handle leakage bug
(David Baggett/Paul Redondo/Eyal Lebedinsky)
일부 새로운 테스트가 추가되었습니다.
버그 수정 :
ctime_r macro had an incorrect argument (Erik Hensema),
threads were not being created
PTHREAD_CANCEL_DEFERRED. This should have
had little effect as deferred is the only
supported type. (Ross Johnson).
일부 호환성 개선이 추가되었습니다.
pthread_setcancelstate accepts NULL pointer
for the previous value argument. Ditto for
pthread_setcanceltype. This is compatible
with Solaris but should not affect
standard applications (Erik Hensema)
일부 새로운 테스트가 추가되었습니다.
버그 수정 - 조건 변수에서 대기하는 스레드 취소 이제 제대로 작동합니다 (Lorin Hochstein 및 Peter Slacik)
pthread_exit () 호출하는 경우 예외 스택 정리 수정
조건 변수의 버그 수정 - (Peter Slacik) : - 추가 경합 점검 - 시간이 정한 Condvar 타임 아웃 후 대기 스레드 수를 올바르게 조정합니다.
일부 사소한 버그가 수정되었습니다. 자세한 내용은 changelog 파일을 참조하십시오.
더 많은 Posix 1B 기능이 포함되어 있지만 Ony는 호출되면 오류 (enosys)를 반환합니다. 그들은:
sem_open
sem_close
sem_unlink
sem_getvalue
내부적으로 지원 된 일부 POSIX 1B 기능은 이제 내보내기 기능으로 제공됩니다.
sem_init
sem_destroy
sem_wait
sem_trywait
sem_post
sched_yield
sched_get_priority_min
sched_get_priority_max
일부 사소한 버그가 수정되었습니다. 자세한 내용은 changelog 파일을 참조하십시오.
최초 출시.