Member 12793258 Ответов: 4

Как я могу использовать потоки?


я хочу написать программу
эта одна функция получает числа
еще одна функция подсчета среднего числа чисел
это должно быть сделано параллельно и использоваться потоками

Что я уже пробовал:

i want to write program 
that one function get numbers
another function counting avg of numbers
it should be done parallel and used threads

#realJSOP

Разве ваш инструктор не показывал вам, как использовать нити, прежде чем дать вам это задание?

Member 12793258

никогда они этого не делают
к несчастью

4 Ответов

Рейтинг:
33

OriginalGriff

Это не очень хорошее использование потоков: один ждет, пока пользователь наберет текст, а затем почти ничего не умирает. Другой ждет, пока наиболее приспособленный что-нибудь сделает, а потом тоже умирает почти ничего.
Почти наверняка менее эффективно и медленнее даже пытаться сделать это с помощью отдельных потоков, чем делать это в одном потоке!

Найдите лучший пример задачи для "распараллеливания" и посмотрите на Класс BackgroundWorker (System.ComponentModel)[^] для примера того, как начать. Это довольно простое введение.


Member 12793258

нет не ждите
вы вводите количество параллельных показать СР

OriginalGriff

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

Member 12793258

в консольном приложении я ввел цифры

хорошо?
под него другие функции AVG
мы должны использовать два потока в основном
потому что у нас есть две функции
я поставил решение
посмотрите пожалуйста

OriginalGriff

Подумайте об этом.
Консольное приложение сидит там и ждет, когда пользователь наберет номер и нажмет ENTER, да? Он не может сделать ничего другого.

Что может сделать "поток усреднения", пока это происходит? Ничего - потому что ему нужно число, чтобы добавить его к "итогу до сих пор", прежде чем он сможет разделить его на количество записей, чтобы сгенерировать среднее.

Таким образом, у вас есть две задачи, *обе из которых ждут одного и того же* и обе из которых могут делать только тривиальные вещи с данными, когда они поступают, прежде чем ждать следующего элемента.

Это не повышение эффективности, это очень неэффективная трата процессорного времени и ресурсов для выполнения работы, которая лучше выполняется без потоковой обработки.

Так что найдите лучший пример задачи,которую можно улучшить с помощью потоковой обработки!

Member 12793258

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

OriginalGriff

Затем перечитайте вопрос еще раз-потому что то, о чем вы просите нас помочь, ужасно усложняет тривиальную задачу, и трудно поверить, что кто-то считает это хорошей идеей.
Это все равно что купить машину только для того, чтобы сэкономить на износе обуви! :смеяться:

Рейтинг:
23

manu_dhobale

Есть много статей, доступных в интернете. просто следуйте за одним из них. и написать какой-нибудь код
если вы видите какие-либо проблемы при попытке сделать это, опубликуйте свою проблему.

Обратиться Многопоточность в C#[^]


Рейтинг:
1

Member 12793258

int main(int argc, char *argv[])
{
  std::thread first (f1);     
  std::thread second (f2);  
  // synchronize threads:
  first.join();                
  second.join();               

}


#realJSOP

Почему вы дали ему ответ на c++?

Рейтинг:
0

Member 12793258

#include <cstdlib>
#include <iostream>
#include <window.h>
#include <thread>


using namespace std;

int main(int argc, char *argv[])
{
    while(1);
    return 0;
}
int a,flag1=0,flag2=0;
int f1(void *)
{
    while(1)
    {
            flag2=0;
            cin>>a;
            flag1=1;
            while (flag2==0)
            sleep(100);
            flag1=0;
     }
}
int f2(void *)
{
    int sum=0,count=0;
    while(!flag1==0)
    {
        sleep(100);
        sum+=a;
        count++;
        cout<<sum/count;
        flag2=1;
     }
}