C++ 多线程互斥锁(mutex,lock,lock_guard)

[TOC]

源代码

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
33
34
#include <iostream>
#include <thread>

void work1(int& sum) {
for (int i = 1; i < 5000; i++) {
sum += i;
}
}

void work2(int& sum) {
for (int i = 5000; i <= 10000; i++) {
sum += i;
}
}

int fun() {
int sum = 0;
for (int i = 1; i <= 10000; i++) {
sum += i;
}
return sum;
}

int main()
{
int ans = 0;
std::thread t1(work1, std::ref(ans));
std::thread t2(work2, std::ref(ans));
t1.join();
t2.join();
std::cout << "sum1 : " << ans << std::endl;
std::cout << "sum2 : " << fun() << std::endl;
return 0;
}

第一实现 mutex参数lock, unlock

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
33
34
35
36
37
38
39
40
#include <iostream>
#include <thread>
#include <mutex>

void work1(int& sum, std::mutex& mylock) {
for (int i = 1; i < 5000; i++) {
mylock.lock();
sum += i;
mylock.unlock();
}
}

void work2(int& sum, std::mutex& mylock) {
for (int i = 5000; i <= 10000; i++) {
mylock.lock();
sum += i;
mylock.unlock();
}
}

int fun() {
int sum = 0;
for (int i = 1; i <= 10000; i++) {
sum += i;
}
return sum;
}

int main()
{
std::mutex mylock;
int ans = 0;
std::thread t1(work1, std::ref(ans), std::ref(mylock));
std::thread t2(work2, std::ref(ans), std::ref(mylock));
t1.join();
t2.join();
std::cout << "sum1 : " << ans << std::endl;
std::cout << "sum2 : " << fun() << std::endl;
return 0;
}

第二种 lock_guard类模板

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
33
34
35
36
37
38
#include <iostream>
#include <thread>
#include <mutex>

void work1(int& sum, std::mutex& mylock) {
for (int i = 1; i < 5000; i++) {
std::lock_guard<std::mutex> mylock_guard(mylock);
sum += i;
}
}

void work2(int& sum, std::mutex& mylock) {
for (int i = 5000; i <= 10000; i++) {
std::lock_guard<std::mutex> mylock_guard(mylock);
sum += i;
}
}

int fun() {
int sum = 0;
for (int i = 1; i <= 10000; i++) {
sum += i;
}
return sum;
}

int main()
{
std::mutex mylock;
int ans = 0;
std::thread t1(work1, std::ref(ans), std::ref(mylock));
std::thread t2(work2, std::ref(ans), std::ref(mylock));
t1.join();
t2.join();
std::cout << "sum1 : " << ans << std::endl;
std::cout << "sum2 : " << fun() << std::endl;
return 0;
}

https://cloud.tencent.com/developer/article/1583894

image-20220322180612011