aboutsummaryrefslogtreecommitdiffhomepage
path: root/content/20210515-pthread_cancel-noexcept/thread.cc
diff options
context:
space:
mode:
Diffstat (limited to 'content/20210515-pthread_cancel-noexcept/thread.cc')
-rw-r--r--content/20210515-pthread_cancel-noexcept/thread.cc40
1 files changed, 40 insertions, 0 deletions
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 <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;
+}