diff options
author | crupest <crupest@outlook.com> | 2021-04-20 14:02:53 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-04-20 14:02:53 +0800 |
commit | b5f4d06abcb6464206d7c7d922484ac0980f2b9d (patch) | |
tree | feae69ce530707c749dade0ee4d58942f854195b /operating-system-challenge/3/main.cpp | |
parent | def5d0bea2a6054765dc37b30b739f8a68add6af (diff) | |
download | life-b5f4d06abcb6464206d7c7d922484ac0980f2b9d.tar.gz life-b5f4d06abcb6464206d7c7d922484ac0980f2b9d.tar.bz2 life-b5f4d06abcb6464206d7c7d922484ac0980f2b9d.zip |
Add OS challenge 3.
Diffstat (limited to 'operating-system-challenge/3/main.cpp')
-rw-r--r-- | operating-system-challenge/3/main.cpp | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/operating-system-challenge/3/main.cpp b/operating-system-challenge/3/main.cpp new file mode 100644 index 0000000..461c775 --- /dev/null +++ b/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;
+}
|