#define READER_CNT 8
#define LOOP_COUNT 5000000
#include <iostream>
#include <mutex> // For std::unique_lock
#include <shared_mutex>
#include <thread>
class shared_mutex_counter {
public:
shared_mutex_counter() = default;
unsigned int get() const {
std::shared_lock<std::shared_mutex> lock(mutex_);
return value_;
}
void increment() {
std::unique_lock<std::shared_mutex> lock(mutex_);
value_++;
}
private:
mutable std::shared_mutex mutex_;
unsigned int value_ = 0;
};
class mutex_counter {
public:
mutex_counter() = default;
unsigned int get() const {
std::unique_lock<std::mutex> lk(mutex_);
return value_;
}
void increment() {
std::unique_lock<std::mutex> lk(mutex_);
value_++;
}
private:
mutable std::mutex mutex_;
unsigned int value_ = 0;
};
void test_shared_mutex()
{
shared_mutex_counter counter;
int temp;
auto writer = [&counter]() {
for (int i = 0; i < LOOP_COUNT; i++) {
counter.increment();
}
};
auto reader = [&counter, &temp]() {
for (int i = 0; i < LOOP_COUNT; i++) {
temp = counter.get();
}
};
std::thread** tarray = new std::thread*[READER_CNT];
clock_t start = clock();
for (int i = 0; i < READER_CNT; i++)
{
tarray[i] = new std::thread(reader);
}
std::thread tw(writer);
for (int i = 0; i < READER_CNT; i++)
{
tarray[i]->join();
}
tw.join();
clock_t end = clock();
printf("[test_shared_mutex]\n");
printf("thread count:%d\n", READER_CNT);
printf("result:%d cost:%dms temp:%d \n", counter.get(), end - start, temp);
}
void test_mutex()
{
mutex_counter counter;
int temp;
auto writer = [&counter]() {
for (int i = 0; i < LOOP_COUNT; i++) {
counter.increment();
}
};
auto reader = [&counter, &temp]() {
for (int i = 0; i < LOOP_COUNT; i++) {
temp = counter.get();
}
};
std::thread** tarray = new std::thread*[READER_CNT];
clock_t start = clock();
for (int i = 0; i < READER_CNT; i++)
{
tarray[i] = new std::thread(reader);
}
std::thread tw(writer);
for (int i = 0; i < READER_CNT; i++)
{
tarray[i]->join();
}
tw.join();
clock_t end = clock();
printf("[test_mutex]\n");
printf("thread count:%d\n", READER_CNT);
printf("result:%d cost:%dms temp:%d \n", counter.get(), end - start, temp);
}
int main() {
//In order to eliminate the irrelevant factors of the test program, only one is opened during the test.
test_shared_mutex();
// test_mutex();
}
环境:
12线程Windows
结果:
MinGW:
[test_mutex]
thread count:8
result:5000000 cost:2234ms temp:5000000
[test_shared_mutex]
thread count:8
result:5000000 cost:19146ms temp:5000000
MSVC(VS2019):
[test_mutex]
thread count:8
result:5000000 cost:1463ms temp:5000000
[test_shared_mutex]
thread count:8
result:5000000 cost:1298ms temp:5000000