#include <thread>
#include <iostream>
#include <vector>
#include <mutex>
using namespace std;
struct Counter
{
mutex mutex_;
int value;
Counter() :value(0)
{
}
void increment()
{
++value;
}
void decrement()
{
mutex_.lock();
--value;
mutex_.unlock();
}
};
int main()
{
Counter counter;
vector<thread> threads;
for (int i = 0; i < 5;i++)//在使用多线程的程序中操作共享数据的时候一定要小心,由于线程的乱序执行,可能会得到意想不到的结果
{
threads.push_back(thread([&]()
{
for (int i = 0; i < 10000;++i)
{
counter.increment();
}
}));
}
for (auto& thread:threads)
{
thread.join();
}
cout << counter.value << endl;
system("pause");
return 0;
}
#include <thread>
#include <iostream>
#include <vector>
#include <mutex>
using namespace std;
struct Counter
{
mutex mutex_;
int value;
Counter() :value(0)
{
}
void increment()
{
mutex_.lock();
++value;
mutex_.unlock();
}
void decrement()//由于创建线程是使用lambda表达式,并使用引用的方式访问counter这个变量,当没有使用lock来保护的时候(情况【1】),执行的结果可能不像预期的5000(程序的意思是每个线程使counter中的value自加1000次,5个线程运行结束的时候应该是5000),当没有使用锁的时候自加的操作可能被其他线程打断,因此结果可能会小于5000。
{
mutex_.lock();
--value;
mutex_.unlock();
}
};
int main()
{
Counter counter;
vector<thread> threads;
for (int i = 0; i < 5;i++)//在使用多线程的程序中操作共享数据的时候一定要小心,由于线程的乱序执行,可能会得到意想不到的结果
{
threads.push_back(thread([&]()
{
for (int i = 0; i < 10000;++i)
{
counter.increment();
}
}));
}
for (auto& thread:threads)
{
thread.join();
}
cout << counter.value << endl;
system("pause");
return 0;
}
#include <thread>
#include <iostream>
#include <vector>
#include <mutex>
using namespace std;
struct Counter
{
mutex mutex_;
int value;
Counter() :value(0)
{
}
void increment()
{
mutex_.lock();
++value;
mutex_.unlock();
}
void decrement()
{
mutex_.lock();
--value;
mutex_.unlock();
}
};
int main()
{
Counter counter;
vector<thread> threads;
for (int i = 0; i < 5;i++)//在使用多线程的程序中操作共享数据的时候一定要小心,由于线程的乱序执行,可能会得到意想不到的结果
{
threads.push_back(thread([&]()
{
for (int i = 0; i < 10000;++i)
{
counter.increment();
}
}));
threads[i].join();
}
cout << counter.value << endl;
system("pause");
return 0;
}
#include <iostream>
#include <vector>
#include <mutex>
using namespace std;
struct Counter
{
mutex mutex_;
int value;
Counter() :value(0)
{
}
void increment()
{
++value;
}
void decrement()
{
mutex_.lock();
--value;
mutex_.unlock();
}
};
int main()
{
Counter counter;
vector<thread> threads;
for (int i = 0; i < 5;i++)//在使用多线程的程序中操作共享数据的时候一定要小心,由于线程的乱序执行,可能会得到意想不到的结果
{
threads.push_back(thread([&]()
{
for (int i = 0; i < 10000;++i)
{
counter.increment();
}
}));
}
for (auto& thread:threads)
{
thread.join();
}
cout << counter.value << endl;
system("pause");
return 0;
}
#include <thread>
#include <iostream>
#include <vector>
#include <mutex>
using namespace std;
struct Counter
{
mutex mutex_;
int value;
Counter() :value(0)
{
}
void increment()
{
mutex_.lock();
++value;
mutex_.unlock();
}
void decrement()//由于创建线程是使用lambda表达式,并使用引用的方式访问counter这个变量,当没有使用lock来保护的时候(情况【1】),执行的结果可能不像预期的5000(程序的意思是每个线程使counter中的value自加1000次,5个线程运行结束的时候应该是5000),当没有使用锁的时候自加的操作可能被其他线程打断,因此结果可能会小于5000。
{
mutex_.lock();
--value;
mutex_.unlock();
}
};
int main()
{
Counter counter;
vector<thread> threads;
for (int i = 0; i < 5;i++)//在使用多线程的程序中操作共享数据的时候一定要小心,由于线程的乱序执行,可能会得到意想不到的结果
{
threads.push_back(thread([&]()
{
for (int i = 0; i < 10000;++i)
{
counter.increment();
}
}));
}
for (auto& thread:threads)
{
thread.join();
}
cout << counter.value << endl;
system("pause");
return 0;
}
#include <thread>
#include <iostream>
#include <vector>
#include <mutex>
using namespace std;
struct Counter
{
mutex mutex_;
int value;
Counter() :value(0)
{
}
void increment()
{
mutex_.lock();
++value;
mutex_.unlock();
}
void decrement()
{
mutex_.lock();
--value;
mutex_.unlock();
}
};
int main()
{
Counter counter;
vector<thread> threads;
for (int i = 0; i < 5;i++)//在使用多线程的程序中操作共享数据的时候一定要小心,由于线程的乱序执行,可能会得到意想不到的结果
{
threads.push_back(thread([&]()
{
for (int i = 0; i < 10000;++i)
{
counter.increment();
}
}));
threads[i].join();
}
cout << counter.value << endl;
system("pause");
return 0;
}