C++ форсирующий поток и мьютекс
Я только начал на повышение. Я хотел бы спросить, хорошо ли мой код использует мьютекс. Чтобы проверить это, я написал код, который считает сумму чисел от 1 до n. Глупый способ посчитать это, но я использовал нить... просто чтобы попробовать мьютекс...
#include <boost/thread/mutex.hpp>
#include <boost/thread/thread.hpp>
#include <iostream>
#define NUMBER 10
boost::mutex mutex;
unsigned long long sum = 0;
class counter
{
public:
counter() : count(0) { }
unsigned long long increment()
{
return ++count;
}
private:
unsigned long long count;
};
counter c;
void count()
{
boost::mutex::scoped_lock scoped_lock(mutex);
unsigned long long i = c.increment();
sum += i;
std::cout << "i=" << i << "\tsum=" << sum << std::endl;
}
int main(int, char*[])
{
boost::thread_group thrds;
for (int i=0; i < NUMBER; ++i)
{
thrds.create_thread(&count);
}
thrds.join_all();
system("pause");
return 0;
}
Результаты выглядят хорошо и без мьютекса выглядят плохо, поэтому я думаю, что использовал их правильно, но просто хочу спросить, все ли в порядке. Спасибо за любой совет; Я надеюсь, что это будет полезно для меня и других.
1 ответ
Решение
Выглядит хорошо, хотя я бы не использовал глобальные переменные, но дело не в вашем примере...
Вам также следует заблокировать cout, если вы используете его где-то еще, потому что это может привести к бессмысленному результату, если над ним одновременно работают два потока.