一、线程同步题
两个线程同时对一个全局变量++操作,保证最后的结果正确
(1)原子操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <iostream> #include <thread> #include <mutex> #include <atomic> using namespace std;
atomic_int g_data = 0;
void add(int id) { for (int i = 0; i < 5; ++i) { ++g_data; cout << id << " add : "<< g_data << endl; } } int main() { thread tha(add, 1); thread thb(add, 2);
tha.join(); thb.join(); return 0; }
|
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
(2)互斥锁
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <iostream> #include <thread> #include <mutex> #include <atomic> using namespace std;
int g_data = 0;
std::mutex mtx; void add(int id) { for (int i = 0; i < 5; ++i) { mtx.lock(); ++g_data; cout << id << " add : " << g_data << endl; mtx.unlock(); } } int main() { thread tha(add, 1); thread thb(add, 2);
tha.join(); thb.join(); return 0; }
|
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
(3)RAII包装类管理互斥锁
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include <iostream> #include <thread> #include <mutex> #include <atomic> using namespace std;
int g_data = 0;
std::mutex mtx; void add(int id) { for (int i = 0; i < 5; ++i) { std::lock_guard<mutex> lock(mtx); ++g_data; cout << id << " add : " << g_data << endl; } } int main() { thread tha(add, 1); thread thb(add, 2);
tha.join(); thb.join(); return 0; }
|
![在这里插入图片描述](data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)