From 1a088951089023d4ee18f01a0b83b71287c4d847 Mon Sep 17 00:00:00 2001 From: johannst Date: Sat, 15 May 2021 22:17:43 +0200 Subject: new post: pthread_cancel in c++ --- content/20210515-pthread_cancel-noexcept/thread.cc | 40 ++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 content/20210515-pthread_cancel-noexcept/thread.cc (limited to 'content/20210515-pthread_cancel-noexcept') diff --git a/content/20210515-pthread_cancel-noexcept/thread.cc b/content/20210515-pthread_cancel-noexcept/thread.cc new file mode 100644 index 0000000..73370be --- /dev/null +++ b/content/20210515-pthread_cancel-noexcept/thread.cc @@ -0,0 +1,40 @@ +// file : thread.cc +// compile: g++ thread.cc -o thread -lpthread + +#include + +#include +#include + +struct S { + ~S() { + const char msg[] = "cancellation-point\n"; + // write() -> pthread cancellation point. + write(STDOUT_FILENO, msg, sizeof(msg)); + } +}; + +std::atomic gReleaseThread{false}; + +void* threadFn(void*) { + while (!gReleaseThread) {} + + // Hit cancellation point in destructor which + // is implicitly `noexcept`. + S s; + + return nullptr; +} + +int main() { + pthread_t t; + pthread_create(&t, nullptr /* attr */, threadFn, nullptr /* arg */); + + // Cancel thread and release it to hit the cancellation point. + pthread_cancel(t); + gReleaseThread = true; + + pthread_join(t, nullptr /* retval */); + + return 0; +} -- cgit v1.2.3