diff options
Diffstat (limited to 'content/2021-05-15-pthread_cancel-noexcept')
-rw-r--r-- | content/2021-05-15-pthread_cancel-noexcept/thread.cc | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/content/2021-05-15-pthread_cancel-noexcept/thread.cc b/content/2021-05-15-pthread_cancel-noexcept/thread.cc new file mode 100644 index 0000000..73370be --- /dev/null +++ b/content/2021-05-15-pthread_cancel-noexcept/thread.cc @@ -0,0 +1,40 @@ +// file : thread.cc +// compile: g++ thread.cc -o thread -lpthread + +#include <atomic> + +#include <pthread.h> +#include <unistd.h> + +struct S { + ~S() { + const char msg[] = "cancellation-point\n"; + // write() -> pthread cancellation point. + write(STDOUT_FILENO, msg, sizeof(msg)); + } +}; + +std::atomic<bool> 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; +} |