Форум программистов, компьютерный форум CyberForum.ru

Нужно ли синхронизировать доступ к переменной из двух потоков? - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Память класса http://www.cyberforum.ru/cpp-beginners/thread575724.html
у меня есть кусок программы, скажите пожалуйста могу ли я присвоить переменной state_ другое значение и почему комментарий про объединение памяти классов?? void perform_operation() { // calling some implementation methods. // Usually, this is achieved using PImpl idiom (except some moments), but here we have a directive do_work_1(); // calling method of base class, which...
C++ Помощь с блок схемой Здравствуйте. Не знаю, как отобразить в блок-схеме данную строчку return n ? gcd(n, m % n) : m; буду благодарен за разъяснение http://www.cyberforum.ru/cpp-beginners/thread575714.html
Помогите решить,элементарные задачи. C++
Приветствую кодеров,и хотел бы попросить помощи,в решении несложных задач.Которые мне к сожалению не дадуться.Потому что совсем не разбираюсь в С++.Если получиться,кто будет решать задачи,сможете сделать их самым обычным способом)Заранее благодарен. 1)Тело имеет форму параллелепипеда с высотой h. Прямоугольник в основе имеет диагональ d. Известно, что диагонали прямоугольника пересекаются под...
Нужно узнать количество ядер в системе C++
Пока получается что-то типо такого... PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer; PDWORD length; GetLogicalProcessorInformation(Buffer, length); cout<<Buffer->ProcessorMask; но пишет, что переменные буфер и ленс не инициализированы. А чем их инициализировать? или вообще есть более простой вариант?
C++ Одномерный массив http://www.cyberforum.ru/cpp-beginners/thread575705.html
(помогите пожалуйста решить задачу) в одномерном массиве состоящим из вещественных элементов, вычислить 1)модуль максимального по модулю элемента массива 2)сумму элементов массива, расположенного после первого положительного элемента примечание--преобразовать таким образом чтобы с начало располагались все элементы, целая часть которых лежит в интервале ,а потом все остальные
C++ Ошибка "E2238 Multiple declaration" привет ребят) плохо разбираюсь в программировании) подскажите плиз) вопрос следующий. я работаю с односвязным ацикличиским списком struct LIST { int val; LIST *next; }; подробнее

Показать сообщение отдельно
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7934 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
18.05.2012, 13:07     Нужно ли синхронизировать доступ к переменной из двух потоков?
Avazart, Сам подумай, что будет, если этот код начнет работать без синхронизации.

C++
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <boost/thread.hpp>
#include <vector>
#include <iterator>
#include <random>
 
bool number_in_process = false;
bool ended = false;
std::vector<int> numbers;
boost::mutex mutex;
boost::condition_variable cond;
const int max_size = 20;
 
void add_number(std::mt19937& gen, std::uniform_int_distribution<>& distr)
{
   while (!ended)
   {
      if (!number_in_process)
      {
         int value = distr(gen);
         numbers.push_back(value);
         number_in_process = true;
         std::cout << "Value: " << value << " in process: " << number_in_process << std::endl;
         cond.notify_all();
      }
   }
}
 
void print()
{
   boost::unique_lock<boost::mutex> lock(mutex);
   while (1)
   {
      if (number_in_process)
      {
         std::cout << "Numbers size: " << numbers.size() << " numbers: ";
         std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, " "));
         std::cout << std::endl;
         number_in_process = false;
         if (numbers.size() == max_size)
         {
            ended = true;
            break;
         }
      }
      cond.wait(lock);
   }
}
 
int main()
{
   std::mt19937 gen(time(0));
   std::uniform_int_distribution<> distr(0, 25);
   boost::thread add_thread(add_number, gen, distr);
   boost::thread print_thread(print);
   add_thread.join();
   print_thread.join();
   std::cout << "Size: " << numbers.size() << std::endl;
}
 
Текущее время: 11:07. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru