Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
 Аватар для MastAKK
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592

Как работать с переменной в нескольких потоках?

16.08.2014, 23:32. Показов 816. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, вся суть в названии темы. Подскажите, как я могу изменить переменную в дочерних потоках так, чтобы она изменялась и в основном?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2014, 23:32
Ответы с готовыми решениями:

Использование переменной в нескольких потоках
Пишу многопоточный сервер на C#. Всю информацию о клиентах храню в списках (их несколько). Потоков у меня может быть более 1 миллиона,...

Как сделать так чтобы с одной переменной можно было работать на нескольких формах?
Как сделать так чтобы с одной переменной можно было работать на нескольких формах?

Как выполнить процесс в нескольких потоках
Хочу параллельно выполнить get-запросы, однако нет синхронизация взятия значения из массива. Если я сделаю lock при взятии значения из...

6
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
17.08.2014, 00:41
Хабр конечно не самый лучший источник информации, но представление определенное получишь. В любом случае проще прочитать там, чем сейчас тут целую статью писать
1
 Аватар для MastAKK
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
17.08.2014, 00:45  [ТС]
DrOffset, ну что же, действительно, придётся почитать хабр. Может и тонкости какие узнаю.
Благодарб за ссылку
0
И целого heap'а мало
 Аватар для Andrej
96 / 57 / 17
Регистрация: 31.07.2014
Сообщений: 291
17.08.2014, 00:45
Bash
1
clang++ --std=c++11 queue.cpp -o queue -lpthread
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
60
61
62
63
64
65
66
67
68
#include <mutex>
#include <iostream>
#include <thread>
#include <queue>
#include <condition_variable>
 
template <typename Event>
struct ThreadSafeQueue {
public: /* methods: */
        Event /* Called by the consumer. */
        getEvent()
        {
                std::unique_lock<std::mutex> lock(mutex);
                while (events.empty()) {
                        condition_variable.wait(lock);
                }
                auto tmp = events.front();
                events.pop();
                return tmp;
        };
 
        void /* Used by the producer. */
        setEvent(Event event)
        {
                std::lock_guard<std::mutex> lock(mutex);
                events.push(event);
                condition_variable.notify_one();
        };
 
private: /* fields: */
        std::queue<Event> events;
        std::mutex mutex;
        std::condition_variable condition_variable;
};
 
struct Event {
        char c;
};
 
ThreadSafeQueue<Event> queue;
 
void
getChar()
{
        char tmp;
        while (std::cin >> tmp)
        {
                Event event {tmp};
                queue.setEvent(event);
        }
};
 
void
print()
{
        while (true)
        {
                std::cout << queue.getEvent().c << std::endl;
        }
};
 
int
main(int argc, char** argv)
{
        std::thread printer {print};
        printer.detach();
        getChar();
};
На пример, наипростейшая потокобезопастная очередь. Защищена мьютексом, который лочится в RAII стиле, то бишь создаётся переменная std::lock_guard<std::mutex> lock(mutex) она в конструкторе делает lock(), когда теряется область, в деструкторе вызывается unlock(). Вообще, всё это ооп-шный сахар. Помутузь posix threads, или виндапотоки, а всё вышеприведённое - ни что иное как обёртка над системными тредами. Можешь даже сам попробовать потом обернуть нативные потоки согласно плюснотому стандарту.
1
 Аватар для MastAKK
148 / 139 / 18
Регистрация: 13.10.2012
Сообщений: 592
17.08.2014, 01:05  [ТС]
Andrej, проблема в том, что хотелось бы без блокировки потока. То бишь, запустить несколько отдельных потоков, работающих параллельно.
Или mutex позволяет одновременную работу нескольких потоков?
0
И целого heap'а мало
 Аватар для Andrej
96 / 57 / 17
Регистрация: 31.07.2014
Сообщений: 291
17.08.2014, 01:17
MastAKK, да, позволяет. Идея этой штуки как раз в том, чтобы был один потребитель и N производителей событий.
Здесь только потребитель висит на ожидании.
std::thread::detach метод делает поток независимым. А вот std::thread::join ждёт окончания исполнения потока.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
17.08.2014, 10:21
Цитата Сообщение от MastAKK Посмотреть сообщение
Подскажите, как я могу изменить переменную в дочерних потоках так, чтобы она изменялась и в основном?
Для начала почитать про std::atomic/Boost.atomic.

http://ru.cppreference.com/w/cpp/atomic/atomic
http://www.boost.org/doc/libs/... tomic.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.08.2014, 10:21
Помогаю со студенческими работами здесь

Как выполнить подцикл for в (отдельных) нескольких потоках параллельно?
Есть код с двумя циклами for: for (int a = 0; a != numb1; a++) { //тут весь код для запуска и работы потоков для цикла ниже. ...

"Недопустимая операция в нескольких потоках" как исправить данный недуг?
Здравствуйте, помогите пожалуйста исправить ошибку, вроде сделал с горем пополам вывод времени до конца операции распаковки архива,...

Управление соединением с БД в нескольких потоках
Приветик. У меня есть многопоточный сервер и клиент к ниму. Клиент посылает запросы на сервер, а сервер посылает запросы к БД и возвращает...

Сортировка массива в нескольких потоках
Привет всем, у меня небольшая проблема с написанием кода ... Проблема в том, что я не знаю как мне написать программу, которая бы делила...

Недопустимая операция в нескольких потоках
Здравствуйте. В общем проблема такая. Public Sub OnEntryWritten(ByVal source As Object, ByVal e As EntryWrittenEventArgs) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru