题目1:
-
我有N个线程,分别对count++,执行500次,count最小是多少?
A:回答
- T1执行count++,但是并没有写入内存。
- T2-TN-1执行完毕,此时count可以是x
- 但是此时TN只执行了499次。
- T1把count写入内存。count=1.
- TN读取count的值去执行第500次自增,但是此时读出count=1
- T1一直不断的往下执行。一直到执行结束。
- Tn对count执行++并写入,count=2
-
题目:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码
#include <iostream> #include <thread> #include <mutex> #include <condition_variable> // --- 全局共享资源 --- std::mutex mtx; // 互斥锁,保护共享状态 std::condition_variable cv; // 条件变量,用于线程间的通知与等待 bool sub_thread_turn = true; // 共享状态,true表示该子线程执行 // --- 子线程的任务函数 --- void sub_task() { for (int i = 0; i < 50; ++i) { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [] { return sub_thread_turn; }); std::cout << "------ 子线程开始第 " << (i + 1) << " 轮循环 ------" << std::endl; for (int j = 0; j < 10; ++j) { std::cout << "Sub thread running: " << j + 1 << std::endl; } // 更改状态,轮到主线程执行 sub_thread_turn = false; // 通知一个正在等待的线程(这里是主线程) cv.notify_one(); } } int main() { // 创建并启动子线程 std::thread t(sub_task); for (int i = 0; i < 50; ++i) { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [] { return !sub_thread_turn; }); std::cout << "------ 主线程开始第 " << (i + 1) << " 轮循环 ------" << std::endl; for (int j = 0; j < 100; ++j) { std::cout << "Main thread running: " << j + 1 << std::endl; } sub_thread_turn = true; cv.notify_one(); } if (t.joinable()) { t.join(); } return 0; } -
s