LINUX.ORG.RU

Горю

 ,


1

1

Помогите с задачей, скоро здавать. Напишите двухпоточную программу. Главный поток случайно генерирует числа массива, например int a[2][10] Первый поток считает сумму элементов первой строки массива(и по мере возможности выписывает результат) Второй поток считает сумму элементов второй строки массива(и по мере возможности выписывает результат) Главный поток считает целую сумму(int) из частичных сумм определенных потоками выше(и по мере возможности выписывает результат)

Прим. Код программы массива на СИ можно менять, «жевать» и т.д. это не существенно

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main(void)
{
  srand(time(NULL));
  int a[2][10];
  int i, j;
  int row_sum = 0;
  int total_sum = 0;
  
  for (i = 0; i<2; i++) 
  {
    for (j = 0; j<10; j++)
    {
     a[i][j] = rand() % 100 + 1;
    }
  }
 
  for (i = 0; i<2; i++)  
  {
    for (j = 0; j<10; j++)
    {
      row_sum += a[i][j];
      total_sum += a[i][j];
      
    }
    printf("sum of the row %d =  %d", i, row_sum);
    row_sum = 0;
    printf("\n"); 
  }
  
  printf("sum of the matrix = %d\n", total_sum);
  
  return 0;
}

Прим. Код программ работы потоками , тоже можно менять,

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define REENTRANT

int create_thread;
int connect_thread;
int disconnect_thread;
char bufor[BUFSIZ];


void koniec(char tekst[])
  {
    printf("%s",tekst);
    exit(1);
  }


void *rob()
  {
    printf("[watek] I am the thread of program.\n");
    printf("Input data : ");
    fgets(bufor,BUFSIZ,stdin);    
 //   return bufor;
    pthread_exit(0); //exit(0);
  }

int main()
  {
    pthread_t id_watku;
    printf("[system] Doing function PTHREAD_CREATE ...\n");
    create_thread=pthread_create(&id_threadd,NULL,rob,&wat);
    if (create_thread==-1) koniec("PORAZKA\n");

    printf("[program] I am the main program.\n");
    printf("[program] Waiting for data from my thread...\n");

    printf("[system] Connecting thread ...\n");    
    connect_thread=pthread_join(id_threadd,NULL);
    if (connect_thread==-1) koniec("PORAZKA\n");

    printf("[program] Took data ... %s\n",bufor);

    printf("[system] Disconnecting thread...\n");
    disconnect_thread=pthread_detach(id_threadd);
    if (disconnect_thread==-1) koniec("PORAZKA\n");
    
    printf("[Program] End.\n");
    exit(0);
  }

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#define REENTRANT

int create_thread;
int connect_thread;
int disconnect_thread;

//Taking an arguments to thread by structure

typedef struct _Wat {
	int	nr;
	int	suma;
	} Thread;


void* rob(void* _wat) {
	Thread* wat = (Thread*)_wat;
	printf("Thread get the %d, %d\n",wat->nr,wat->suma);
	pthread_exit(0);	
}


void koniec(char tekst[])
  {
    printf("%s",tekst);
    exit(-1);
  }


int main()
  {
    pthread_t id_threadd;

Thread wat;
	wat.nr  = 10;
	wat.suma  = 0;


    printf("[system] Doing function PTHREAD_CREATE ...\n");
    create_thread=pthread_create(&id_threadd,NULL,rob,&wat);
    if (create_thread==-1) koniec("PORAZKA\n");

    printf("[program] I am the main program.\n");
    printf("[program] Waiting for data from my thread...\n");

    printf("[system] Connecting thread ...\n");    
    connect_thread=pthread_join(id_threadd,NULL);
    if (connect_thread==-1) koniec("PORAZKA\n");

    
    printf("[system] Disconnecting thread...\n");
    disconnect_thread=pthread_detach(id_threadd);
    if (disconnect_thread==-1) koniec("PORAZKA\n");
    
    printf("[Program] End.\n");
    exit(0);
  }

Ответ на: комментарий от yovosiw533

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

Если же ты пытался, но у тебя что-то не получилось, то выкладывай код, который ты написал, пиши, как он должен был работать по твоему мнению, как работает на самом деле, что тебя не устраивает, и что непонятно. В общем, чтоб было ясно, что ты действительно что-то делаешь, а не пытаешься найти рабов, которые будут на тебя бесплатно работать только потому, что у тебя что-то там подгорает.

aureliano15 ★★
()

У меня в квартире ремонт недоделан, приедь, доделай бесплатно в своё рабочее время? Тебе же не трудно, чо ты.

Alve ★★★★★
()

Я заню, но не скажу. Потому что я добрый человек. Ты почти смог, смоги до конца. Ибо если ты на таком задании самостоятельно не раздуплишь то дальше вообще потеряешься. Мой совет, вот прям по человечески от души. Взми ручку и тетрадку и в блок схеме нарисуй потоки и как они друг у друга данные берут. Не спеша, остынь часик. Потом вернись и пошагово реализуй. Тут не сложно, но ВАЖНО что бы ты сам понял. А ты поймёшь, просто тебе кажется что нет.

И совет, спрашивай явно типа - «я вот тут делаю вот так, должно быть XXX а у меня YYY» на такие вопросы тебе ответят. Есть просто вариант что ты неправильно понимаешь как оно работает всё. И если тебе кто-то явно тыкнет в решение это будет беда ибо ты будешь тупо знать «как» но не «почему».

А когда раздуплишь у тебя случится эврика и ты будешь подобные задачки решать за 5 минут потом включая написание кода. Будет здорово и в первую очередь тебе самому.

anonymous
()

А в чем помочь-то надо, не понятно. Ты этот код компилировал? Проверял?

seiken ★★★★★
()

Почти не умею в С, но что то я не вижу здесь 2 потоков. Нигде.

Ps. а код на польском почему? Одолжили :)

Pups
()
Последнее исправление: Pups (всего исправлений: 1)
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <string.h>
 
#define ERROR_CREATE_THREAD -11
#define ERROR_JOIN_THREAD   -12
#define BAD_MESSAGE         -13
#define SUCCESS               0
 
typedef struct  someArgs_tag {
    int *a;
    int sum;

} someArgs_t;
 
void* helloWorld(void *args) {
    someArgs_t *arg = (someArgs_t*) args;
    int len;
 
    arg->sum=0;
    
	for(int i=0;i<10;i++)
	{
        printf("helloWorldFunc %i\n",arg->a[i]);
		arg->sum+=arg->a[i];
	}
     
    return SUCCESS;
}
 
#define NUM_THREADS 2
 
int main() {
    pthread_t threads[NUM_THREADS];
    int status;
    int i;
    int status_addr;
    someArgs_t args[NUM_THREADS];
	
	
	 int a[2][10];
	  srand(time(NULL));
	    
  for (int i = 0; i<2; i++) 
  {
    for (int j = 0; j<10; j++)
    {
     a[i][j] = rand() % 100 + 1;
        printf("%i\n",a[i][j]);
    }
  }
  
	
    for (i = 0; i < NUM_THREADS; i++) {

        //args->a[i]=malloc(10*sizeof(int));
     //memcpy(args->a[i],a[i],10);
        args[i].a=&a[i];
    }
 
    for (i = 0; i < NUM_THREADS; i++) {
        status = pthread_create(&threads[i], NULL, helloWorld, (void*) &args[i]);
        if (status != 0) {
            printf("main error: can't create thread, status = %d\n", status);
            exit(ERROR_CREATE_THREAD);
        }
    }
 
    printf("Main Message\n");
 
    for (i = 0; i < NUM_THREADS; i++) {
        status = pthread_join(threads[i], (void**)&status_addr);
        if (status != SUCCESS) {
            printf("main error: can't join thread, status = %d\n", status);
            exit(ERROR_JOIN_THREAD);
        }
        printf("joined with address %d\n", status_addr);
    }
 
	int total=0;
    for (i = 0; i < NUM_THREADS; i++) {
        //printf("thread %d arg.out = %d\n", i, args[i].out);
        	printf("sum %i", args[i].sum);
		total+=args[i].sum;
    }
    
	printf("Total sum %i", total);
    return 0;
}

15 минут чтения https://learnc.info/c/pthreads_create_and_join.html

CrazyAlex25 ★★★
()
Последнее исправление: CrazyAlex25 (всего исправлений: 1)
Ответ на: комментарий от CrazyAlex25

Ну вот. А мы ведь обсуждали похожий топик. Теперь автор защитит лабу, и всем будет рассказывать, какой он крутой программист. И на собеседовании нужно будет его как-то отсеивать…

seiken ★★★★★
()
Ответ на: комментарий от seiken

И на собеседовании нужно будет его как-то отсеивать…

Попроси его написать двухпоточную программу. Главный поток случайно генерирует числа массива, например int a[2][10] Первый поток считает сумму элементов первой строки массива(и по мере возможности выписывает результат) Второй поток считает сумму элементов второй строки массива(и по мере возможности выписывает результат) Главный поток считает целую сумму(int) из частичных сумм определенных потоками выше(и по мере возможности выписывает результат)

ya-betmen ★★★★★
()
Ответ на: комментарий от seiken

на собеседовании нужно будет его как-то отсеивать

А их и так отсеивают. Репутация нашего образования примерно равна нулю. Я свой диплом за 18 лет с момента его получения никогда никому не показывал.

sergej ★★★★★
()
Ответ на: комментарий от sergej

Я свой диплом за 18 лет с момента его получения никогда никому не показывал

Я тоже. 2 раза спрашивали что есть мол диплом, я такой говорю что да мол есть ну и всё дальше тема переходит к иному собсна на этом разговоры о филькиных грамотах заканчиваются и начинаются вопросы из реального мира.

P.S. Диплома у меня нет

anonymous
()
Ответ на: комментарий от anonymous

Т.e. ты врешь своему потенциальному работодателю? И потом будешь врать коллегам в курилке/за обедом?

seiken ★★★★★
()

Трансформировал, не благодари,

let a = [[1,2], [3,4]],
    obj = {
        "sa1": 0,
        "sa2": 0,
        "sat": 0
    };

function sum(ax, obj, key,  name) {
    for (let i = 0; i < ax.length; i++) {
        let x = obj[key] + ax[i];
        obj[key] = x;
        console.log (name, x);
    }
}

setTimeout (function () { sum (a[0], obj, "sa1", "sum a[0]:" ); }, 0);
setTimeout (function () { sum (a[1], obj, "sa2", "sum a[1]:" ); }, 0);

sum ([obj["sa1"], obj["sa2"]], obj, "sat",  "sum total: ");

Там чуть допилить осталось, малость прям. Ну ты уж как нибудь сам.

kostyarin_ ★★
()
Ответ на: комментарий от Alve

У меня в квартире ремонт недоделан, приедь, доделай бесплатно в своё рабочее время? Тебе же не трудно, чо ты.

Пиши адрес.

anonymous
()

if (create_thread==-1) koniec(«PORAZKA\n»);

ale syf

Princesska ★★★★
()
Ответ на: комментарий от seiken

его как-то отсеивать…

его только что уже отсеяли…

anonymous
()
Ответ на: комментарий от CrazyAlex25

Вот ты ща своего начальника считай продвинул, паренёк видишь смолоду учиться делегировать грамотно. Получать будет в 3 раза больше твоего минимум.

pon4ik ★★★★★
()
Ответ на: комментарий от CrazyAlex25

Но дабы всё таки подстелить соломки(pinvoke и более продвинутые методы взаимодействия никто не отменял) - рекомендую помимо создания потоков также изучить основы параллельного программирования хотя бы и тут.

pon4ik ★★★★★
()
Ответ на: комментарий от Pups

Да, совсем немного, перейти на другой ЯП (или вернуться на С).

Там написано что в разных тредах. Но не написано, что нельзя при этом использовать sleep. Просто спишь в потоке какое-то время. Время только высчитать на основе длин массивов и всё. Задание ведь точно нужно давать, а не какую-то фигню.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

А, ну если так мыслить, то нигде не оговаривается ещё и то, что вывод или результат должен быть корректным. Предлагается просто провести суммирование. Поэтому даже синхронизация на уровне sleep(которая по факту таковой не является и абсолютно никаких гарантий не даёт, можно легко привести сценарий когда результат будет неконсистентным) не является обязательной, поэтому пока победитель специальной олимпиады не так очевиден, решение от @CrazyAlex25 тоже подходит под условия задачи.

pon4ik ★★★★★
()
Ответ на: комментарий от kostyarin_

Задание ведь точно нужно давать, а не какую-то фигню.

Пффф… Ахахахахахаха… Вы ВУЗе давно были, батенька? Там, например, приносишь чертёж, препод на нём почеркает (сука ручкой!), а затем в общагу/домой идёшь и исправляешь как сказано. Приносишь обратно выполненный по newТЗ, на нём опять почеркают, исправляешь как было изначально. На repeat x2-x3. Походил так молча? Сдал на 5. А если включил «а вы же говорили…», то сдал на 3 (но при этом столько же раз ходил сдавать). До сих пор горит. Никогда не забуду.

anonymous
()
Ответ на: комментарий от CrazyAlex25

А ну если ты потроллил, то сорри, я хотел как лучше. Надо какое-то кодовое лор-слово ввести, чтобы тупняки типа меня парсили а не лезли поправлять:)

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

А ну если ты потроллил, то сорри, я хотел как лучше. Надо какое-то кодовое лор-слово ввести, чтобы тупняки типа меня парсили а не лезли поправлять:)

А толку, ты же даже код смотреть не стал, а сразу ругаться полез. По коду же было понятно. Есть Сарказм, кстати.

anonymous
()
Ответ на: комментарий от pon4ik

которая по факту таковой не является и абсолютно никаких гарантий не даёт, можно легко привести сценарий когда результат будет неконсистентным

Пф, просто вероятность отказа увеличивается. Там же не написано, что всё для идеальных условий, а значит шанс отказа изначально не нулевой.

В конце концов, давать задачу для Си, в которой для решения нужно соервшить более одного действия – само по себе абсурд. Ещё на китайских счётх сосчитать предложили бы – не справился – не прошёл.

По итог выходит, что от Си проще отказаться – и это и есть решение.

kostyarin_ ★★
()
Ответ на: комментарий от anonymous

На repeat x2-x3

Ну так преподы же все бывшие студенты – считай больные не голову после такого.

kostyarin_ ★★
()
Ответ на: комментарий от anonymous

Думаешь, на тебе одном так преподы отыгрывались? Пффф, это тоже люди, и зачастую с большим количеством комплексов/лысиной и всё такое 😀

menangen ★★★★★
()
Ответ на: комментарий от menangen

Пусть ТС напишет прогу на Go и принесёт преподу. На каналах повертит старого чёрта 🤣

Я тут как-то натыкался на фиберы и каналы для Си: https://github.com/acl-dev/libfiber#channel-api . Если старикана жалко, а себя нет, то можно попробовать.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

Есть ещё libdill и libmill для си, но они однопоточные… проще уж тогда взять эпловскую libdispatch (она в опенсорсе), но изучать он её будет скорее всего дольше, чем на нативных нитях написать в C17

menangen ★★★★★
()
Ответ на: комментарий от anonymous

Так же было в универе. У нас один догадался чертеж в файлик засунуть, что бы препод на нем красной ручкой мулевал)

Gibson1980 ★★
()
Ответ на: комментарий от menangen

Думаешь, на тебе одном так преподы отыгрывались? Пффф, это тоже люди, и зачастую с большим количеством комплексов/лысиной и всё такое 😀

Так да, «новые технологии» тогда пошли, а эти, возможно, только от руки калякать и могли, а переучиваться не хотели. Старые они были.

anonymous
()
Ответ на: комментарий от Gibson1980

Так же было в универе. У нас один догадался чертеж в файлик засунуть, что бы препод на нем красной ручкой мулевал)

в файлик

Выпускник шараги детектед.

anonymous
()
Ответ на: комментарий от menangen

С другой стороны, после таких разъёбов переносить стоны заказчика как-то проще. Молча к счёту накидываем процент и делаем как говорит. Вообще на изи. Возможно, в этом и была фишка. Сейчас уже не узнать…

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.