@@ -30,18 +30,19 @@ struct Data2
30
30
31
31
static Data2 gData2 ;
32
32
33
+ template <std::memory_order memory_order>
33
34
static void test1 () noexcept
34
35
{
35
36
auto start = std::chrono::steady_clock::now ();
36
37
std::thread thread1 ([](Data1& data1) noexcept
37
38
{
38
39
for (std::size_t i = 0 ; i < ITERATION_COUNT; ++i)
39
- data1.value1 .fetch_add (1 );
40
+ data1.value1 .fetch_add (1 , memory_order );
40
41
}, std::ref (gData1 ));
41
42
std::thread thread2 ([](Data1& data1) noexcept
42
43
{
43
44
for (std::size_t i = 0 ; i < ITERATION_COUNT; ++i)
44
- data1.value2 .fetch_add (1 );
45
+ data1.value2 .fetch_add (1 , memory_order );
45
46
}, std::ref (gData1 ));
46
47
thread1.join ();
47
48
thread2.join ();
@@ -50,18 +51,19 @@ static void test1() noexcept
50
51
std::cout << " test1: " << elapsedTime << std::endl;
51
52
}
52
53
54
+ template <std::memory_order memory_order>
53
55
static void test2 () noexcept
54
56
{
55
57
auto start = std::chrono::steady_clock::now ();
56
58
std::thread thread1 ([](Data2& data2) noexcept
57
59
{
58
60
for (std::size_t i = 0 ; i < ITERATION_COUNT; ++i)
59
- data2.value1 .fetch_add (1 );
61
+ data2.value1 .fetch_add (1 , memory_order );
60
62
}, std::ref (gData2 ));
61
63
std::thread thread2 ([](Data2& data2) noexcept
62
64
{
63
65
for (std::size_t i = 0 ; i < ITERATION_COUNT; ++i)
64
- data2.value2 .fetch_add (1 );
66
+ data2.value2 .fetch_add (1 , memory_order );
65
67
}, std::ref (gData2 ));
66
68
thread1.join ();
67
69
thread2.join ();
@@ -82,11 +84,20 @@ int main()
82
84
gData2 .value1 .store (0 );
83
85
gData2 .value2 .store (0 );
84
86
87
+ std::cout << " memory order: sequentially consistent" << std::endl;
85
88
for (std::size_t i = 0 ; i < TEST_RUN_COUNT; ++i)
86
89
{
87
90
std::cout << " Run: " << i << std::endl;
88
- test1 ();
89
- test2 ();
91
+ test1<std::memory_order_seq_cst>();
92
+ test2<std::memory_order_seq_cst>();
93
+ }
94
+
95
+ std::cout << " memory order: relaxed" << std::endl;
96
+ for (std::size_t i = 0 ; i < TEST_RUN_COUNT; ++i)
97
+ {
98
+ std::cout << " Run: " << i << std::endl;
99
+ test1<std::memory_order_relaxed>();
100
+ test2<std::memory_order_relaxed>();
90
101
}
91
102
return 0 ;
92
103
}
0 commit comments