LINUX.ORG.RU

Потоки. Не отрабатывается функция потока. С#.

 


0

2

Задача: Вычислить математическое выражение по блокам. Каждый блок считать в отдельном потоке. Вот код:

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


int sum1 = 0;
int sum2 = 0;
int sum3 = 0;
int  a, b, c, d; 


void *S1( void *arg )
 {  
     sum1 = ( b - c ) * 4;
 }

void *S2( void *arg )
 {
     sum2 = ( d + b * c ) * 2;
 }

void *S3( void *arg )
 {
     sum3 = ( d + b) * a ;
 } 

int main( )
 {
   pthread_t thread1, thread2, thread3;
   
   int a, b, c, d; 
   int D1, D2, D3;

   D1 = 1;
   D2 = 2;
   D3 = 3;   
 
   scanf("%d%d%d%d", &a, &b, &c, &d );


   pthread_create( &thread1, NULL, S1, &D1 ); 

   pthread_join( thread1, NULL );  

   pthread_create( &thread2, NULL, S2, &D2 );

   pthread_join( thread2, NULL ); 

   pthread_create( &thread3, NULL, S3, &D3 );

   pthread_join( thread3, NULL ); 
 
   int s = sum1 + sum2 + sum3; 

   printf( "\nSum = %d\n", s );

   return 0;

 } 
Программа ничего не выводит, просто зависает. Пробовал убирать джоины, тогда выводит нуль, т.е. не отрабатывает функции потока вообще. В чём дело? Как это исправить?



Последнее исправление: cetjs2 (всего исправлений: 5)

Не, ну а man pthread_join не судьба почитать. Ей как минимум тип pthread_t надо передавать первым аргументом

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

a,b,c,d объявленные внутри main затеняют глобальные

shamaz
()

Совет такой: не лезь в потоки, а разберись на каком языке ты пишешь, и как это надо делать

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

Да ты же чортов гений! Я объявил переменные a, b, c, d в main, и помимо глобальных создались ещё локальные переменные с именем как у глобальных, и считал я как раз эти локальные переменные. Спасибо тебе добрый человек!

na9ort
() автор топика

Попробуй сменить тег с «csharp» на «objective-c». Вдруг поможет.

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

Да ты же чортов гений!

А вот и нет. Если бы я тебе не сказал чё делать, у тебя до сих пор что-то там где-то провисало. Я считаю, ты должен по пиву всем, кто тут отписался

shamaz
()

Последнее исправление: cetjs2 28.11.2013 21:59:29 (всего исправлений: 5)

Поубивал бы! А то я думаю: как это, когда всякая дрянь у меня в черном списке тегов, в уведомления пришло сообщение? А оно вона как, оказывается: ТС зафигачил сначала тег [си]! Некошерно!

Eddy_Em ☆☆☆☆☆
()

В чем смысл использования потоков, если после запуска каждого из них делать join?

Надеюсь, тебя отчислят.

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

Почитал код. Это жесть. Соглашусь с анонимом:

Надеюсь, тебя отчислят.

Eddy_Em ☆☆☆☆☆
()

Дожидаться окончания потока сразу после его запуска, перед запуском следующего - это сильно.

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

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

ТС, анонима плюсовать не буду, но с потоками тебе явно надо разобраться...

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

Он просто некомпетентен. Ждем, когда сделают его модератором

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

Создавать целый поток для просчета простой функции с 1 набором данных - это сильно

shamaz
()

А причём тут сидиез? это ж чистый си

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