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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Объясните общие моменты: среда разработки, библиотеки и т.п http://www.cyberforum.ru/cpp-beginners/thread1243467.html
Хочу начать изучение С++. На примере написания какого-нибудь приложения для Windows, с окнами и графикой. У меня есть Вижуал-студия 2005, писать планирую в ней. На этом, собственно мои знания заканчиваются :). Не будут ли любезны участники форума ответить на несколько моих глупых вопросов? Например, язык Microsoft Visual C++ 2005 - это С++ или нет, и сильны ли отличия? Позволяет ли язык/среда...
C++ Вывод данных на принтер В книге ООП С++ Лафоре есть пример вывода на принтер... #include <iostream> #include <fstream> using namespace std; int main() { char* s1 = "Some text..."; http://www.cyberforum.ru/cpp-beginners/thread1243441.html
C++ Передача или редактирование данных в Dll
Во общем ситуация такая: Инжектю я dll'ку в процесс, и она там в цыкле выводит на пример Messagebox(...), вот как я могу изменить выводимый текст в выводимом dll;кой Messagebox'е? Я пока нубик по плюсам, хотел бы узнать как это делается и возможно ли это во обще? Добавлено через 5 часов 50 минут Все еще актуально...
Зачем нужно возвращать ссылку на объекты потоковых типов? C++
В книжке Герберта Шилдта четко и ясно указано, что для того, чтобы перегружать операции ввода-вывода, надо возвращать ссылку на объект потоковых типов, вроде примеров, приведенных ниже. ostream &operator<<(ostream &stream_left, ThreeD &obj_right) { stream_left << obj_right.x << ", "; stream_left << obj_right.y << ", "; stream_left << obj_right.z; return stream_left; }
C++ Extern: Есть ли на данный момент набор инструментов, которые позволили бы использовать другие языки http://www.cyberforum.ru/cpp-beginners/thread1243404.html
Всем доброго времени суток. Часто встречаю использование оператора (если это, конечно, вообще оператор) extern в виде конструкции extern "C". Погуглив немного я выяснил, что оператор принимает любой строковый литера и задался вопросом - а есть ли на данный момент набор инструментов, которые позволили бы использовать другие языки, например Java, Pascal? Спасибо
C++ Пишем рогалик: пояснения по коду и его критика Здравствуйте! Сегодня сел писать рогалик, в процесе возникло несколько вопросов (в виде коментариев в коде): main.cpp #include <iostream> #include <fstream> #include <stdlib.h> подробнее

Показать сообщение отдельно
Andrej
И целого heap'а мало
 Аватар для Andrej
93 / 54 / 9
Регистрация: 31.07.2014
Сообщений: 293
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, или виндапотоки, а всё вышеприведённое - ни что иное как обёртка над системными тредами. Можешь даже сам попробовать потом обернуть нативные потоки согласно плюснотому стандарту.
 
Текущее время: 23:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru