aboutsummaryrefslogtreecommitdiffhomepage
path: root/content/2021-05-15-pthread_cancel-noexcept
diff options
context:
space:
mode:
authorjohannst <johannes.stoelp@gmail.com>2021-07-15 21:20:14 +0200
committerjohannst <johannes.stoelp@gmail.com>2021-07-15 21:20:14 +0200
commit82e9ac4163b46b59e121194f84ac370818482923 (patch)
treeb52adf8f5b2bafe7904f563c33ec23f46cb7c87c /content/2021-05-15-pthread_cancel-noexcept
parent617d73fc9eff5b08a80b873fd97f66caa7e80fc9 (diff)
downloadblog-82e9ac4163b46b59e121194f84ac370818482923.tar.gz
blog-82e9ac4163b46b59e121194f84ac370818482923.zip
use proper date fmt in content file names that zola can automatically can derive the date
Diffstat (limited to 'content/2021-05-15-pthread_cancel-noexcept')
-rw-r--r--content/2021-05-15-pthread_cancel-noexcept/thread.cc40
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;
+}