Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638

Thread. Многопоточность

10.08.2019, 16:31. Показов 4139. Ответов 26

Студворк — интернет-сервис помощи студентам
Привет! есть код, код не мой, но хотелось бы разобраться, по возможности. Нужно генерировать строки
в диапазоне [0, 100)
Кликните здесь для просмотра всего текста
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
69
70
71
72
73
74
75
76
77
78
79
mutex mtx;
 
class Make_timer
{
public:
    Make_timer() :t1(system_clock::now()) { }
    void reset() { t1 = system_clock::now(); }
 
    void operator()(const string& label)
    {
        auto t2 = system_clock::now();
        cout << "  " << label << " tool: "
            << duration_cast<milliseconds>(t2 - t1).count() << " ms.\n";
    }
private:
    system_clock::time_point t1;
};
 
 
string get_string()
{
    const unsigned int min = 1;
    const unsigned int max = 100;
    const unsigned int low = 33;
    const unsigned int high = 126;
 
    stringstream ss;
    thread_local static default_random_engine ran;
    auto len = uniform_int_distribution<>{ (int)min, (int)max }(ran);
 
    for (auto i = 0; i < len; ++i)
    {
        ss << uniform_int_distribution<>{(int)low, (int)high}(ran);
    }
    return ss.str();
}
 
template<typename C>
C random_fill(int n)
{
    C vs;
    for (auto i = 0; i < n; ++i)
        vs.insert(get_string());
    return vs;
}
 
 
void fill_task(set<string>& vs, int n, mutex& m)
{
    set<string> v = random_fill<set<string>>(n);
 
    unique_lock<mutex> lck(m);
    //copy(v.begin(), v.end(), back_inserter(vs));
    for (const auto& a : v)
        vs.insert(a);
}
 
set<string> threaded_fill(int n)
//fill a large vector with random strings.
{
    set<string> vs;
    const int num_threads = 8;
    
    //const int num_threads = thread::hardware_concurrency();
 
    //cout << "number of threds " << num_threads << "\n";
 
    mutex mtx;
    vector<thread> vt;
    for (auto i = 0; i < num_threads; ++i)
        vt.push_back(thread(fill_task, ref(vs), n / num_threads, ref(mtx)));
 
    for (auto& t : vt)
        t.join();
 
    cout << "vector size: " << vs.size() << '\n';
 
    return vs;
}


//Здесь код из функции main():
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int main()
{
    //....
const int max1 = 500000;
        const int max2 = 5000000;
    Make_timer timer;
    cout << "Filling both vectors..\n";
    timer.reset();
    //vector<string> vs1 = random_fill(max1);
    //vector<string> vs2 = random_fill(max2);
    set<string> vs1 = threaded_fill(max1);
    set<string> vs2 = threaded_fill(max2);
    timer("set fills");
    //....
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.08.2019, 16:31
Ответы с готовыми решениями:

Многопоточность в C++11. std::thread
Привет всем! использую таким образом многопоточность class A { public: void fun() { } };

Std::thread автоматическая многопоточность
Есть данный пример создания массива thread и инициализации его в цикле. #include&lt;iostream&gt; #include&lt;sstream&gt; ...

Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list"
Не могу сообразить почему возникает ошибка. У меня в классе есть метод, который должен работать в нескольких потоках одновременно. Вот он: ...

26
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
11.08.2019, 17:06
Студворк — интернет-сервис помощи студентам
oleg-m1973, и ещё такой вопрос насчёт потоков, в линукс с posix есть шаблон функции для которой выделяется поток и эта функция void * fun(void), почему тип функции (процедуры) void и возвращает она указатель на void?

Добавлено через 7 минут
Просто насколько же мне известно то функции типа void (процедуры) ничего не возвращают, какой смысл делать указатель на void?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
11.08.2019, 17:06
Цитата Сообщение от Vanconts Посмотреть сообщение
oleg-m1973, и ещё такой вопрос насчёт потоков, в линукс с posix есть шаблон функции для которой выделяется поток и эта функция void * fun(void), почему тип функции (процедуры) void и возвращает она указатель на void?
Зачем там возвращается void *, я не знаю. А параметр - тоже void * - туда передаётся последний параметр из pthread_create, чтоб можно было передать какие-то параметры в процедуру потока. В винде так же.
0
 Аватар для Liss29
225 / 39 / 4
Регистрация: 18.11.2012
Сообщений: 1,638
11.08.2019, 17:12  [ТС]
На 100'000'000 выкидывает bad_allocation, а вот на 5000000 всё красиво: par: 274; seq: 1510; 5.51095!
Теперь наглядно убедился, что с многозадачность сила, выполняется гораздо быстрее, спасибо!
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
11.08.2019, 17:15
oleg-m1973, насчёт параметра все ясно, а вообще функция типа void *, что она возвращает? И почему она вообще что-то возвращает так как все говорят что void ничего не возвращает?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
11.08.2019, 17:16
Цитата Сообщение от Vanconts Посмотреть сообщение
oleg-m1973, насчёт параметра все ясно, а вообще функция типа void *, что она возвращает? И почему она вообще что-то возвращает так как все говорят что void ничего не возвращает?
Здесь не void, а указатель на void, т.е. просто указатель без типа.
0
4 / 3 / 1
Регистрация: 08.08.2019
Сообщений: 238
11.08.2019, 17:33
oleg-m1973, но я не могу понять, для чего он нужен? Или через него можно вернуть указатель на что угодно?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
11.08.2019, 17:35
Цитата Сообщение от Vanconts Посмотреть сообщение
oleg-m1973, но я не могу понять, для чего он нужен? Или через него можно вернуть указатель на что угодно?
Ну да. Потом преобразуешь к указателю с типом и работаешь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.08.2019, 17:35

Boost::thread std::thread
чем отличается boost::thread( ) от std::thread (с++17)? я спрашиваю не о способе реализации потоков в целом, а конкретно о этих функциях....

Boost::thread vs std::thread
Доброго времени суток, решил углубить свои знания, и решил почитать про потоки, бустовые и те что в 11 стандарте приняли, с бустом все ясно...

C++11. thread, mutex, thread-safety
есть функция, которая стартует 2 потока: для отлова нажатия клавиш и для выполнения действий void Trainer::start() { const HANDLE...

Thread
#include &lt;iostream&gt; #include &lt;thread&gt; using namespace std; void task1(){ cout &lt;&lt; &quot;task1&quot;; } int main() { std::thread...

Thread
Доброго времени суток господа! Вопрос в коде в комментариях. #include &lt;iostream&gt; #include &lt;thread&gt; enum { DELAY = 5 }; ...


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru