70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,848
1

Глобальная переменная в нескольких потоках и ее extern

12.10.2021, 12:17. Показов 1508. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте,


Подскажите пожалуйста, я что то не пойму:

Вот я создал простую функцию my_func() в отдельном .cpp - в котором просто определил две глобальные переменные и запустил эту функцию в потоках.

Далее из main я вызываю еще одну функцию my_other_func() - в которой через extern получаю доступ к глобальной переменной из функции my_func().

Но, вот чего я не понимаю - когда я запускаю функцию my_func() в нескольких потоках, то глобальных переменных тоже создается несколько ??
Когда я делаю extern std::list<int> my_global_list - какой именно переменной из какого потока я расширяю зону видимости ?


//*отдельный my_func.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <list>
#include <mutex>
 
 
std::mutex my_mutex;
std::list<int> my_global_list;       //в функции просто определяю глобальную переменную
 
 
void my_func() 
{
      while(1)
      {
      Sleep(1);
      }
}




//*отдельный my_other_func.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <mutex>
#include <list>
 
extern std::mutex my_mutex;
extern std::list<int> my_global_list;       //Расширяю область глобальной переменной определенной в функции my_func.
 
 
void my_other_func()
{
 
my_mutex.lock();
my_global_list.push_back(555);
my_mutex.unlock();
 
}




// main()
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
#include <iostream>
#include <string>
#include <vector>
#include <thread>
#include <mutex>
#include <list>
 
 
 
 
int main()
{
 
std::vector<std::thread>my_vector_thread;
 
 
       for(int i=0;i<4; i++)
       {
       my_vector_thread[i] = std::thread()my_func;
       }
 
 
my_other_func();
 
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2021, 12:17
Ответы с готовыми решениями:

Глобальная переменная для нескольких form
Всем привет. У меня имеется две формы, в одной их них textBox в другой label, надо сделать так,...

Глобальная переменная, собирающая значения из нескольких форм
Приветствую. Столкнулся со следующей проблемой: необходима глобальная переменная/класс,...

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз
Исходники: /* main.cpp */ #include &quot;hider.h&quot; int main(void) { return 0; } /* foo.cpp */

Глобальная переменная, локальная переменная, параметр переменные, параметр заполнения
Где здесь глобальная переменная, локальная переменная, параметр переменные, параметр заполнения...

Глобальная переменная
Добрый день Уважаемые Форумчане. Объясните пожалуйста, для чего служит нужно объявлять...

6
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
12.10.2021, 12:25 2
Лучший ответ Сообщение было отмечено Optimus11 как решение

Решение

Цитата Сообщение от Optimus11 Посмотреть сообщение
когда я запускаю функцию my_func() в нескольких потоках, то глобальных переменных тоже создается несколько ??
Нет. Одна.

Цитата Сообщение от Optimus11 Посмотреть сообщение
extern std::list<int> my_global_list - какой именно переменной из какого потока я расширяю зону видимости ?
Эта переменная к потоку не привязана. Она одна на всех.

Это вы что-то спутали с thread_local похоже.
1
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,848
13.10.2021, 19:29  [ТС] 3
Цитата Сообщение от DrOffset Посмотреть сообщение
Эта переменная к потоку не привязана. Она одна на всех.
Это получается, если я вызываю к примеру из двух потоков одновременно одну и ту же функцию, в которой есть глобальная статическая переменная и функция к примеру производит какие то операции с этой переменной, это получается будет "гонка данных" и такую переменную под мьютексом нужно держать ?
0
Вездепух
Эксперт CЭксперт С++
11688 / 6367 / 1723
Регистрация: 18.10.2014
Сообщений: 16,050
13.10.2021, 19:35 4
Цитата Сообщение от Optimus11 Посмотреть сообщение
Далее из main я вызываю еще одну функцию my_other_func() - в которой через extern получаю доступ к глобальной переменной из функции my_func().
Ничего не понял. В вашем коде переменная - глобальная. Она не "из функции", она глобальная.

Цитата Сообщение от Optimus11 Посмотреть сообщение
std::list<int> my_global_list;       //в функции просто определяю глобальную переменную
Опять та же самая белиберда. Почему в комментарии написано "в функции определяю", когда переменная определена совсем не в функции?

Цитата Сообщение от Optimus11 Посмотреть сообщение
если я вызываю к примеру из двух потоков одновременно одну и ту же функцию, в которой есть глобальная статическая переменная
Та же самая бессмыслица. Откуда взялось вот это "функцию, в которой есть глобальная статическая переменная"? Ваши переменные к вашим функциям никакого отношения не имеют вообще. Между ними нет никакой связи.
1
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
13.10.2021, 19:37 5
Цитата Сообщение от Optimus11 Посмотреть сообщение
это получается будет "гонка данных" и такую переменную под мьютексом нужно держать ?
Да, разумеется.
1
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,848
13.10.2021, 21:03  [ТС] 6
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Ничего не понял. В вашем коде переменная - глобальная. Она не "из функции", она глобальная.

Опять та же самая белиберда. Почему в комментарии написано "в функции определяю", когда переменная определена совсем не в функции?
Да, путаюсь в терминах. Первый вопрос был именно про глобальную.



Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Та же самая бессмыслица. Откуда взялось вот это "функцию, в которой есть глобальная статическая переменная"? Ваши переменные к вашим функциям никакого отношения не имеют вообще. Между ними нет никакой связи.
Второй не совсем относится к первоначальному коду, второй вопрос был про глобальную в рамках функции, то есть static.

Добавлено через 1 час 20 минут
Цитата Сообщение от DrOffset Посмотреть сообщение
Это вы что-то спутали с thread_local похоже.
То есть добавление thread_local для глобальной или глобально-статической переменной - будет создавать такую переменную в рамках конкретного потока ? Судя по такому простенькому коду да, но решил на всякий случай уточнить.


my_func_test.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <thread>
#include <string>
 
 
 
thread_local static std::string my_string = "Hello";
 
 
std::string my_func_test(std::string my_strinos)
{
 
    my_string = my_string + my_strinos;
 
 
    return my_string;
 
}

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
#include <iostream>
#include <windows.h>
#include "my_func_test.h"
 
 
 
void my_func()
{
 
    std::string my_string = my_func_test("first");
 
    std::cout << my_string << std::endl;
}
 
 
 
int main()
{
 
    std::thread my_thread = std::thread(my_func);
 
    Sleep(2000);
 
    std::string my_string = my_func_test("second");
 
    std::cout << my_string << std::endl;
 
 
 
    my_thread.join();
}
0
18822 / 9826 / 2401
Регистрация: 30.01.2014
Сообщений: 17,260
13.10.2021, 21:08 7
Цитата Сообщение от Optimus11 Посмотреть сообщение
в рамках конкретного потока
Да.
1
13.10.2021, 21:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.10.2021, 21:08
Помогаю со студенческими работами здесь

Глобальная переменная
Доброе время суток. Я новичок во Flash:-[. Мне нужна глобальная переменная. В хелпе написано как ее...

Глобальная переменная
Имеется макет Отчета, чтобы не переписывать в коде каждый раз запрос, я написал функцию печати с...

глобальная переменная
есть программка: Private Sub Command1_Click() Picture1.Cls n = Val(Text1.Text) For i = 1 To n...

Глобальная переменная
А как обьявить переменную и установить ей значение, так чтобы она была видна во всём макросе с тем...

Глобальная переменная
Имеется функция в которую при событии онклик попадает переменная news_id function...

Глобальная переменная
Можно как-нибудь объявить переменную или константу, чтобы её было видна во всех кадрах и мови...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru