Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
Заблокирован

Многопоточность. Вывести сколько раз значения второго массива попадаются в первом массиве

14.06.2017, 15:30. Показов 4677. Ответов 59
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть задачка: Есть два массива и нужно вывести сколько раз значения второго массива попадаются в первом масиве, я это сделала, но нужно использовать многопоточность, И тут нужна ваша помощь.
Скидываю свой код, сильно не бросайте камнями. Я попробывала раздилить на два потока. Но хочется правильно и красво сделать.
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
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <thread> 
 
size_t CountValue(const int* array, const size_t size, const int value)
{
    const int* begin = array;
    const int* end = array + size;
 
    const int* low = std::lower_bound(begin, end, value);
    if ((low != end) && (*low == value))
    {
        auto up = std::upper_bound(low, end, value);
        return std::distance(low, up);
    }
    return 0;
}
 
int main()
{
    int arrayFirst[] = { 11, 5, 2, 8, 4, 5, 2, 5, 7, 9, 12, 16, 17, 18, 20 };
    int arraySecond[] = { 22, 5, 8, 3, 2, 9, 4, 3, 9, 10 };
    int size = sizeof(arraySecond) / sizeof(arraySecond[0]);
    std::sort(arraySecond, arraySecond + size);
    
    //const std::size_t maxThreadCount = std::thread::hardware_concurrency();
    //std::vector<std::thread> threads(maxThreadCount);
 
    std::vector<std::thread> threads1(size / 2);
    std::vector<std::thread> threads2(size / 2);
    for (int index = 0; index < size / 2; ++index) 
    {
        if (arraySecond[index] != arraySecond[index + 1])
            std::cout << "Value:" << arraySecond[index] << "-" << CountValue(arrayFirst, size, arraySecond[index]) << "\n";
        threads1[index].join();
    }
    for (int index = size / 2; index < size; ++index)
    {
        if (arraySecond[index] != arraySecond[index + 1])
            std::cout << "Value:" << arraySecond[index] << "-" << CountValue(arrayFirst, size, arraySecond[index]) << "\n";
        threads2[index].join();
    }
        
    return 0;
}
Добавлено через 1 час 40 минут
никто не знает?((
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.06.2017, 15:30
Ответы с готовыми решениями:

Определить, сколько раз встречается последний элемент второго массива в первом массиве
Помогите пожалуйста прорамму решить Дано 2 массива х(n) и у(n). Сколько раз встречается последний элемент второго массива у(n) в первом...

Вывести число, которое показывало бы сколько раз в первом столбце были значения больше 10
Есть база dat в которую вносятся рандомные числа в определенном радиусе и так же из этой бд выводится среднее значение в базy dat2. Нужно...

Найти сколько раз различные значения встречаются в массиве и вывести в упорядоченном виде
Дано:массив целых положительных чисел значение которых не превышает числа 8. Найти сколько раз различные значения встречаются в массиве и...

59
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.06.2017, 18:48
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от oksanavol Посмотреть сообщение
MrGluck, вы же используете хеш таблицу?
Да.
1
Заблокирован
14.06.2017, 18:52  [ТС]
MrGluck, а оно точно не на одном потоке работает?
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
14.06.2017, 19:02
oksanavol, если не верите, убедитесь в этом явно
C++
1
2
3
4
5
6
7
8
template <typename T>
void Foo(const std::unordered_map<T, size_t> &um, const T &val)
{
    const auto it = um.find(val);
    std::ostringstream buf;
    buf << std::this_thread::get_id() << '\t' << val << ": " << (it != um.cend() ? it->second : 0) << std::endl;
    std::cout << buf.str();
}
1
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
15.06.2017, 09:58
может как-то так
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
#include <cassert>
#include <iostream>
 
#include <vector>
#include <array>
#include <algorithm>
 
#include <atomic>
#include <mutex>
#include <thread>
#include <condition_variable>
 
size_t thread_num=4;
 
std::mutex m;
std::condition_variable cv;
 
std::atomic<size_t> sum = ATOMIC_VAR_INIT(0);
std::atomic<size_t> index = ATOMIC_VAR_INIT(0);
 
void worker(std::vector<int>& p,std::vector<int>& q){
    std::thread::id this_id = std::this_thread::get_id();
    std::cout<<this_id<<":new worker"<<std::endl;
    for(size_t ix=0;;){
        ix=index.fetch_add(1);
        std::cout<<this_id<<":index="<<ix<<std::endl;
        if (ix<q.size()){
            int test=q[ix];
            for_each(p.begin(),p.end(),[&test](int n){
                if (test==n) sum++;
            });
        }
        else
            break;
    }
    std::cout<<this_id<<":notify at exit"<<std::endl;
    std::unique_lock<std::mutex> lk(m);
    std::notify_all_at_thread_exit(cv, std::move(lk));
}
 
int main()
{
    std::vector<int> p = { 11, 5, 2, 8, 4, 5, 2, 5, 7, 9, 12, 16, 17, 18, 20 };
    std::vector<int> q = { 22, 5, 8, 3, 2, 9, 4, 3, 9, 10 };
    for(size_t i=0;i<thread_num;i++){
        std::thread x(worker,std::ref(p),std::ref(q));
        x.detach();
    }
    std::unique_lock<std::mutex> lk(m);
    while(index<q.size()+thread_num){
        std::cout<<"waiting after index="<<index<<std::endl;
        cv.wait(lk);
    }
    std::cout<<sum<<std::endl;
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
15.06.2017, 11:48
vndtta, у вас data races при выводе. Порядок operator<< не определён.
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
15.06.2017, 12:12
нет, ну можно на них повесить мьютекс, но если не вешать, то сразу видно, что потоки работают одновременно
главное же, чтоб sum посчиался верно, и никакие два потока не обрабатывали один и тот же элемент

Добавлено через 8 минут
п.с. этот вывод, кроме суммы, вообще не нужен, его роль больше как комментария
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
15.06.2017, 12:22
vndtta, Можно формировать вывод в буфер, а потом один раз вызывать operator<< у std::cout. Можете посмотреть пример здесь
Само по себе обращение к std::cout из нескольких потоков разрешено, не определён лишь порядок вызова operator<<
http://www.cplusplus.com/refer... tor%3C%3C/
Data races
Modifies the object pointed by sb (2).
Modifies the stream object.
Concurrent access to the same stream object may cause data races, except for the standard stream objects (cout, cerr, clog, wcout, wcerr and wclog) when these are synchronized with stdio (in this case, no data races are initiated, although no guarantees are given on the order in which characters from multiple threads are inserted).
https://stackoverflow.com/a/26909227
0
93 / 69 / 22
Регистрация: 17.10.2011
Сообщений: 235
15.06.2017, 13:55
Цитата Сообщение от MrGluck Посмотреть сообщение
vndtta, Можно формировать вывод в буфер, а потом один раз вызывать operator<< у std::cout.
но ведь тогда весь вывод будет бесполезным, каждый поток будет выводить отдельно и разом, как будто сначала один поток оработал от начала и до конца, потом второй и т.д.
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
15.06.2017, 15:17
Я бы как-нибудь так попробовал:
Кликните здесь для просмотра всего текста
http://ideone.com/LTTluC
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
#include <iostream>
#include <iterator>
#include <algorithm>
#include <numeric>
#include <thread>
#include <vector>
 
 
std::size_t count_needle(int * first, int *const last,
                         int const* needleFirst, int const* const needleLast) {
   std::sort(first, last);
   
   std::size_t count = 0;
   while (first != last && needleFirst != needleLast) {
      if (*first == *needleFirst) {
         ++count;
         ++first;
      } else if (*needleFirst < *first) {
         ++needleFirst;
      } else {
        ++first;
      }
   }
   
   return count;
}
 
 
int main()
{
    int arrayFirst[] = { 11, 5, 2, 8, 4, 5, 2, 5, 7, 9, 12, 16, 17, 18, 20 };
    int arraySecond[] = { 22, 5, 8, 3, 2, 9, 4, 3, 9, 10 };
    
    std::sort(std::begin(arraySecond), std::end(arraySecond));
    auto const arraySecondEnd = std::unique(std::begin(arraySecond), std::end(arraySecond));
    
    auto const numThreads = std::thread::hardware_concurrency();
    std::vector<std::thread> tasks;
    tasks.reserve(numThreads);
    std::vector<size_t> results(numThreads);
    
    auto const firstSize  = sizeof(arrayFirst) / sizeof(*arrayFirst); 
    auto const firstStep = (firstSize + numThreads - 1) / numThreads;
    
    for (std::size_t i = 0; i != numThreads; ++i) {
        auto const firstBegin = arrayFirst + i * firstStep;
        auto const firstEnd   = arrayFirst + std::min((i + 1) * firstStep, firstSize);
        
        std::thread task([=, &results] () {
            results[i] = count_needle(firstBegin, firstEnd, arraySecond, arraySecondEnd);
        });
        tasks.push_back(std::move(task));
    }
    
    for (auto & task : tasks) {
       task.join();
    }
    
    auto const count = std::accumulate(std::begin(results), std::end(results), std::size_t(0));
    
    std::cout << count << std::endl;
}
0
Заблокирован
18.06.2017, 18:41
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const int sizeFirst = 20;
    const int sizeSecond = 15;
    int arrayFirst[sizeFirst] = {11, 5, 2, 8, 4, 5, 2, 5, 7, 9, 12, 16, 17, 18, 20};
    int arraySecond[sizeSecond] = {22, 5, 8, 3, 2, 9, 4, 3, 9, 10};
 
    //count threads=count processors
    std::unordered_map<int, int> result;
    std::vector <std::thread> init;
    int step = std::ceil((float) sizeSecond / std::thread::hardware_concurrency());
    for (int start = 0; start < sizeSecond;) {
        int end = (start + step < sizeSecond) ? start + step : sizeSecond;
        init.emplace_back([start, end, sizeFirst, &arrayFirst, &arraySecond, &result]() {
            for (int c = start; c < end; c++)
                result[arraySecond[c]] = count(arrayFirst, arrayFirst + sizeFirst, arraySecond[c]);
        });
        start = end;
    }
 
    for (auto & th : init) th.join();
    for (std::pair<int, int> value : result)
        cout << value.first << "->" << value.second << endl;
Добавлено через 29 минут
Цитата Сообщение от MrGluck Посмотреть сообщение
Критика приветствуется
Ну что ж воспользуемся так же?

Цитата Сообщение от MrGluck Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
template <typename T>
void Foo(const std::unordered_map<T, size_t> &um, const T &val)
{
    const auto it = um.find(val);
    std::ostringstream buf;
    buf << val << ": " << (it != um.cend() ? it->second : 0) << std::endl;
    std::cout << buf.str();
}
 
int main()
{
    constexpr int arrayFirst[] = { 11, 5, 2, 8, 4, 5, 2, 5, 7, 9, 12, 16, 17, 18, 20 };
    constexpr int arraySecond[] = { 22, 5, 8, 3, 2, 9, 4, 3, 9, 10 };
    // строим ассоциативный массив для соответствия элемент => сколько раз он встречается в массиве
    std::unordered_map<int, size_t> um;
    for (const auto &x : arrayFirst)
        ++um[x];
    for (const auto &x : arraySecond)
        std::thread(&Foo<int>, um, x).join();
}
1 Сразу бросается в глаза вот что - constexpr для массивов. Зачем? А незачем, оно там вообще не нужно.

2 ++um[x]; )))), а не лучше написать так? um[x]++; Но так же не пописькамеришь так же?

3 Согласно коду, создается столько потоков, сколько чисел в массиве, т.е. если будет в массиве 100500 чисел, то, соответственно будет и 100500 потоков создано. Да уж, ... ))) Но суть, состоит в том, что на самом деле многопоточности вообще нет, он создает поток и ждает пока тот не закончится и так каждый раз.

4 Функция Foo при реальной многопоточности бы легла сразу - ибо cout вообще никак не синхронизирован.

Т.е. сразу видно, что человек в принципе не разбирается в том, что пишет. И не является тем, кем себя позиционирует.
0
What a waste!
 Аватар для gray_fox
1612 / 1304 / 180
Регистрация: 21.04.2012
Сообщений: 2,735
18.06.2017, 20:58
Цитата Сообщение от Sdettws Посмотреть сообщение
C++
1
result[arraySecond[c]]
Тут data race: оператор индексации - не константный.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
18.06.2017, 21:22
Цитата Сообщение от Sdettws Посмотреть сообщение
Сразу бросается в глаза вот что - constexpr для массивов. Зачем? А незачем, оно там вообще не нужно.
Политика минимальных прав и ограничений. Constexpr по дефолту где это возможно. 4 символа дописать не принципиально (на деле меньше, спс IDE). То же самое можно сказать и про const.
Цитата Сообщение от Sdettws Посмотреть сообщение
2 ++um[x]; )))), а не лучше написать так? um[x]++; Но так же не пописькамеришь так же?
Это дело вкуса. Однако в других местах постфиксный оператор будет явно проигрывать. Некоторые предпочитают использовать префиксную запись по умолчанию.
При чём здесь фаллометрия?
Цитата Сообщение от Sdettws Посмотреть сообщение
3 Согласно коду, создается столько потоков, сколько чисел в массиве, т.е. если будет в массиве 100500 чисел, то, соответственно будет и 100500 потоков создано. Да уж, ... )))
По условию, количество потоков мало. А пул потоков для малого кол-ва потоков городить - это из пушки по воробьям.
Цитата Сообщение от Sdettws Посмотреть сообщение
4 Функция Foo при реальной многопоточности бы легла сразу - ибо cout вообще никак не синхронизирован.
cout сам по себе не нуждается в синхронизации, стандарт это гарантирует. В синхронизации нуждаются операторы <<, однако мы используем по одному оператору для каждого потока, а порядок нам не важен. Выше приведены цитаты и ссылки. Так что тут мимо.

Итого всю критику могу обобщить лишь
Т.е. сразу видно, что человек в принципе не разбирается в том, что пишет.
Цитата Сообщение от Sdettws Посмотреть сообщение
И не является тем, кем себя позиционирует.
Кем я себя позиционирую?
1
Заблокирован
19.06.2017, 07:19
Цитата Сообщение от MrGluck Посмотреть сообщение
Constexpr по дефолту где это возможно. 4 символа дописать не принципиально (на деле меньше, спс IDE). То же самое можно сказать и про const.
))) для чего? Где ты это используешь это в коде? )))

Цитата Сообщение от MrGluck Посмотреть сообщение
Однако в других местах постфиксный оператор будет явно проигрывать.
В данном случае не играет роли какой оператор использовать.

Цитата Сообщение от MrGluck Посмотреть сообщение
По условию, количество потоков мало. А пул потоков для малого кол-ва потоков городить - это из пушки по воробьям.
По условию нужна многопоточность - у тебя в единицу времени всегда работает один поток. О чем может быть речь?

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

Цитата Сообщение от MrGluck Посмотреть сообщение
И не является тем, кем себя позиционирует.
Не выполнил задание, что просил автор темы. Написал неправильный код с лишними ключевыми словами.
0
2 / 2 / 0
Регистрация: 18.06.2017
Сообщений: 27
19.06.2017, 07:34
Дам не большой совет, если хотите чтобы программа выглядела красиво, перед int main напишите следующую фразу:
using namespace std;
и уберите разрешения имен в программе. меньше текста и программа более наглядная.
0
Заблокирован
19.06.2017, 08:04
Цитата Сообщение от MrGluck Посмотреть сообщение
Constexpr по дефолту где это возможно.
Фраза - убила, если честно. Дальше вообще не о чем говорить, все с тобой ясно.
0
Модератор
Эксперт CЭксперт С++
 Аватар для sourcerer
5288 / 2376 / 342
Регистрация: 20.02.2013
Сообщений: 5,773
Записей в блоге: 20
19.06.2017, 12:05
 Комментарий модератора 
Sdettws, пожалуйста, прочитайте правила форума.
Особое внимание обратите на пункт 3.1.

.
0
Заблокирован
19.06.2017, 12:11  [ТС]
Препод сказал что то что я показывала. а показывала я это код:
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 <sstream>
#include <thread>
#include <unordered_map>
 
template <typename T>
void Foo(const std::unordered_map<T, size_t> &um, const T &val)
{
    const auto it = um.find(val);
    std::ostringstream buf;
    buf << val << ": " << (it != um.cend() ? it->second : 0) << std::endl;
    std::cout << buf.str();
}
 
int main()
{
    constexpr int arrayFirst[] = { 11, 5, 2, 8, 4, 5, 2, 5, 7, 9, 12, 16, 17, 18, 20 };
    constexpr int arraySecond[] = { 22, 5, 8, 3, 2, 9, 4, 3, 9, 10 };
    // строим ассоциативный массив для соответствия элемент => сколько раз он встречается в массиве
    std::unordered_map<int, size_t> um;
    for (const auto &x : arrayFirst)
        ++um[x];
    for (const auto &x : arraySecond)
        std::thread(&Foo<int>, um, x).join();
}
не подходит. Сама начала переделывать
вот что у меня вышло:
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
#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <thread> 
#include <unordered_map>
 
size_t CountValue(const int* array, const size_t size, const int value)
{
    const int* begin = array;
    const int* end = array + size;
 
    const int* low = std::lower_bound(begin, end, value);
    if ((low != end) && (*low == value))
    {
        auto up = std::upper_bound(low, end, value);
        return std::distance(low, up);
    }
    return 0;
}
 
std::vector<std::pair<size_t, size_t>> GenerateProcessingIntervals(std::size_t maxThreadCount, std::size_t numberCount)
{
    const std::size_t minLength = numberCount / maxThreadCount;
    const std::size_t numLeftNumbers = numberCount % maxThreadCount;
 
    std::vector<std::size_t> intervalLength;
    intervalLength.reserve(maxThreadCount);
 
    for (std::size_t i = 0; i < numLeftNumbers; ++i)
        intervalLength.emplace_back(minLength + 1);
 
    if (minLength > 0)
    {
        for (std::size_t i = numLeftNumbers; i < maxThreadCount; ++i)
            intervalLength.emplace_back(minLength);
    }
 
    std::vector<std::pair<size_t, size_t>> intervals;
    intervals.reserve(intervalLength.size());
 
    intervals.emplace_back(0, intervalLength[0]);
    for (std::size_t index = 1; index < intervalLength.size(); ++index)
        intervals.emplace_back(intervals[index - 1].first + intervals[index - 1].second, intervalLength[index]);
 
    return intervals;
}
 
 
 
int main() 
{
    int array1[] = { 11, 5, 2, 8, 4, 5, 2, 5, 7, 9, 12, 16, 17, 18, 20 };
    int array2[] = { 22, 5, 8, 3, 2, 9, 4, 3, 9, 9 };
    int size1 = sizeof(array1) / sizeof(array1[0]);
    int size2 = sizeof(array2) / sizeof(array2[0]);
    std::sort(array1, array1 + size1);
 
    std::vector<std::pair<size_t, size_t>> intervals = GenerateProcessingIntervals(*array2, size2);
    const auto usedThreadCount = intervals.size();
    std::vector<std::thread> threads;
    threads.reserve(usedThreadCount);
    std::vector<std::vector<std::uint64_t>> foundPrimesPerThread(usedThreadCount);
 
 
    for (const std::pair<size_t, size_t>& interval : intervals) 
        threads.emplace_back(intervals);
    
    for (std::size_t index = 0; index < size2; ++index)
    {
        std::cout << "Value:" << array2[index] << "-" << CountValue(array1, size2, array2[index]) << "\n";
        std::cout << "-------\n";
    }
 
    for (std::size_t index = 0; index < usedThreadCount; ++index)
        threads[index].join();
      return 0;
}
но как я поняла я тут не могу так передавать:
C++
1
threads.emplace_back(intervals);
так как я передаю интервал, а нужно оператор(). Но я так и не поняла ка его использовать. Нужна помощь
Я использую пока один поток: GenerateProcessingIntervals(*array2, size2)
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
19.06.2017, 12:42

Не по теме:

Цитата Сообщение от Sdettws Посмотреть сообщение
Дальше вообще не о чем говорить, все с тобой ясно.
Ок. Тогда ваши посты я тоже просто проигнорю. Смысл мне общаться с тем, кто не слушает? И попрошу на вы.


Цитата Сообщение от Аскул Посмотреть сообщение
Дам не большой совет, если хотите чтобы программа выглядела красиво, перед int main напишите следующую фразу:
using namespace std;
и уберите разрешения имен в программе. меньше текста и программа более наглядная.
Дело в том, что пространства имён придумали не просто так, а для решения возможных конфликтов. И в некоторых случаях использование пространства имён по умолчанию может привести к неочевидным ошибкам. Каждую неделю на форуме создаётся тема, где автор получает ошибку из-за использования названия для функции/переменной из стандартного пространства имён. И это неочевидный факт. Можете посмотреть бегло по ближайшим темам - никто из старожил не использует объявление использования пространства имён std по умолчанию, как минимум глобально.
У нас в проекте по код стайлу разрешено использовать using namespace исключительно в файлах реализации и при этом локально в функции.
Есть ещё один момент - при использовании нескольких библиотек и неуместном использовании using namespace может произойти коллизия, т.к. имена в разных библиотеках будут пересекаться. И порой это может привести к трудноуловимым ошибкам. Так что пусть всё неявное станет чуть более явным. А std:: я уже пишу на автомате, даже не замечая этого.

Добавлено через 2 минуты
Цитата Сообщение от oksanavol Посмотреть сообщение
не подходит
А что конкретно не устраивает?
Тут есть ошибка, связанная с тем, что join блокирует текущий поток до выполнения задачи. Надо область видимости расширить. Сформировать набор потоков в вектор, а потом вызвать для них join.
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
#include <iostream>
#include <sstream>
#include <thread>
#include <unordered_map>
#include <vector>
 
template <typename T>
void Foo(const std::unordered_map<T, size_t> &um, const T &val)
{
    const auto it = um.find(val);
    std::ostringstream buf;
    buf << val << ": " << (it != um.cend() ? it->second : 0) << std::endl;
    std::cout << buf.str();
}
 
int main()
{
    constexpr int arrayFirst[] = { 11, 5, 2, 8, 4, 5, 2, 5, 7, 9, 12, 16, 17, 18, 20 };
    constexpr int arraySecond[] = { 22, 5, 8, 3, 2, 9, 4, 3, 9, 10 };
    // строим ассоциативный массив для соответствия элемент => сколько раз он встречается в массиве
    std::unordered_map<int, size_t> um;
    for (const auto &x : arrayFirst)
        ++um[x];
 
    // создаём вектор с набором задач (потоков)
    std::vector<std::thread> tasks;
    for (const auto &x : arraySecond)
        tasks.emplace_back(&Foo<int>, um, x);
 
    // присоединяем потоки к текущему
    for (auto &th : tasks)
        th.join();
}
0
Заблокирован
19.06.2017, 12:49  [ТС]
MrGluck, )) так Вы мне снова то что мне не подходит пишете.
Сказал, что нужно написать отдельно функцию- GenerateProcessingIntervals , я написала, в которой и разбивать диапазон на потоки. я написала. проверяла, правильно моя функция работает. Теперь мне нужно ее использовать. я ее использую
C++
1
std::vector<std::pair<size_t, size_t>> intervals = GenerateProcessingIntervals(*array2, size2);
но проблема в другом
C++
1
 threads.emplace_back(// что сюда передвать? я  думала intervals , но я ошибалась );
0
с++
1282 / 523 / 225
Регистрация: 15.07.2015
Сообщений: 2,562
19.06.2017, 12:55
прочитайте про потоки
https://habrahabr.ru/post/182610/
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.06.2017, 12:55

Найти сколько раз встречается в данном массиве число 14 и вывести это значения на экран
дан массив 9 на 9 заполнен случайными числами от 0-100найти сколько раз встречается в данном массиве число 14 и вывести это значения на...

Найти все повторяющиеся значения в массиве и вывести сколько раз каждое из них повторяется
Поиск элемента в массиве Дан массив 20 элементов целого типа. Все значения элементов генерируются случайным образом и лежат в...

Вывести максимальный элемент массива и указать, сколько раз он встречается в массиве
Дан одномерный массив размерностью N. Вывести максимальный элемент массива и указать сколько раз он встречается в массиве

Найти минимум в первом массиве, предварительно исключив элементы, совпадающие с элементами второго массива
В чём собственно суть знаменитый диктатор Ли Сий Сын имеет в своём распоряжении армию из 105 человек. Он упорядочил их по убыванию...

Как для каждого значения одного массива вывести все значения второго массива?
Как для каждого значения одного массива вывести все значения второго массива? Есть два массива: Array ( =&gt; 163 =&gt;...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Сезонность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru