aboutsummaryrefslogtreecommitdiff
path: root/works/life/operating-system-challenge/3
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-02-12 15:55:21 +0800
committerYuqian Yang <crupest@crupest.life>2025-02-12 15:55:21 +0800
commit1ecfd0ab7f1f511268fd6404dbc110c3c277b48c (patch)
tree49449a4076ded9bd937a51679318edbe2a532cae /works/life/operating-system-challenge/3
parent55d8b025e8d6ea971e8ee5762c892405fedc316b (diff)
parentf8c10dd1fc55e60f35286475356e48c4f642eb63 (diff)
downloadcrupest-1ecfd0ab7f1f511268fd6404dbc110c3c277b48c.tar.gz
crupest-1ecfd0ab7f1f511268fd6404dbc110c3c277b48c.tar.bz2
crupest-1ecfd0ab7f1f511268fd6404dbc110c3c277b48c.zip
import(life): IMPORT crupest/life COMPLETE.
Diffstat (limited to 'works/life/operating-system-challenge/3')
-rw-r--r--works/life/operating-system-challenge/3/README.md5
-rw-r--r--works/life/operating-system-challenge/3/main.cpp68
-rw-r--r--works/life/operating-system-challenge/3/problem.jpgbin0 -> 25702 bytes
3 files changed, 73 insertions, 0 deletions
diff --git a/works/life/operating-system-challenge/3/README.md b/works/life/operating-system-challenge/3/README.md
new file mode 100644
index 0000000..63fa023
--- /dev/null
+++ b/works/life/operating-system-challenge/3/README.md
@@ -0,0 +1,5 @@
+![problem](problem.jpg)
+
+Translation: Use a lock to achieve that 3 threads print A, B, C in turn for 10 times. Output is `ABCABC...`
+
+Code is in `main.cpp`.
diff --git a/works/life/operating-system-challenge/3/main.cpp b/works/life/operating-system-challenge/3/main.cpp
new file mode 100644
index 0000000..461c775
--- /dev/null
+++ b/works/life/operating-system-challenge/3/main.cpp
@@ -0,0 +1,68 @@
+#include <iostream>
+#include <mutex>
+#include <thread>
+
+int main() {
+ int turn = 1;
+ int count = 0;
+ std::mutex mutex;
+
+ auto thread_proc1 = [&] {
+ while (true) {
+ {
+ std::lock_guard<std::mutex> guard(mutex);
+ if (count >= 10)
+ break;
+ if (turn == 1) {
+ std::cout << "A" << std::endl;
+ turn = 2;
+ }
+ }
+
+ std::this_thread::yield();
+ }
+ };
+
+ auto thread_proc2 = [&] {
+ while (true) {
+ {
+ std::lock_guard<std::mutex> guard(mutex);
+ if (count >= 10)
+ break;
+ if (turn == 2) {
+ std::cout << "B" << std::endl;
+ turn = 3;
+ }
+ }
+
+ std::this_thread::yield();
+ }
+ };
+
+ auto thread_proc3 = [&] {
+ while (true) {
+ {
+ std::lock_guard<std::mutex> guard(mutex);
+ if (count >= 10)
+ break;
+ if (turn == 3) {
+ std::cout << "C" << std::endl;
+ turn = 1;
+ count++;
+ }
+ }
+
+ std::this_thread::yield();
+ }
+ };
+
+ std::thread thread1(thread_proc1);
+ std::thread thread2(thread_proc2);
+ std::thread thread3(thread_proc3);
+
+ thread1.join();
+ thread2.join();
+ thread3.join();
+
+ return 0;
+}
diff --git a/works/life/operating-system-challenge/3/problem.jpg b/works/life/operating-system-challenge/3/problem.jpg
new file mode 100644
index 0000000..c3a61b7
--- /dev/null
+++ b/works/life/operating-system-challenge/3/problem.jpg
Binary files differ