2016-12-17 6 views
0

Вот моя ситуацииделают выход в потоковом фиксированное время

global var n; 
global var result; 
void* solve_for_n(void *arguments) 
{ does_something; 
    put value calculated in result; 
} 
function main 
{ for(n=1;n<30000;n++) 
    { set value of n; 
     create pthread with address of function solve_for_n; 
     wait for reply from pthread; 
     if 5 seconds have passed tell pthread to exit; 
    } 
} 

п переменная заданный основными.
Аналогично результат определяется solve_for_n
Я хочу дать максимум 5 секунд pthread для решения еще чего он должен выйти.
Есть еще много n значений, ожидающих очереди.

Теперь, вот мой код

#include<stdio.h> 
#include<pthread.h> 
#include<sys/time.h> 
#define micro_second_multiplier 1000000 

float interval; 
unsigned long long int m; 
unsigned int done,length,n; 
int bye; 
pthread_mutex_t timeisup; 
void * solveforn(void *arguments) 
{ 
    unsigned long long int multiplicant,sum,quotient,divisor,product,multiplicantincremented,multiplicantdivisor; 
    unsigned int flag,lenofn,maxnumofdigitinproduct,lenmultiplicant,digit; 
    struct timeval begin, end; 

    gettimeofday(&begin, NULL); 
    printf("\nPthread begins"); 
    lenofn=0; 
    divisor=10ll; 
    do 
    { quotient=((unsigned long long)n)/divisor; 
     divisor=divisor*(10ll); 
     lenofn++; 
    }while(quotient!=(0ll)); 
for(multiplicant=multiplicantincremented=1ll,flag=0,lenmultiplicant=1,multiplicantdivisor=10ll;flag!=1;multiplicant++,multiplicantincremented++) 
    { if((multiplicant%(2ll)==(0ll))&&(n%5==0)) 
     { multiplicant++; 
      if(multiplicantincremented==multiplicantdivisor) 
      { lenmultiplicant++; 
       multiplicantdivisor=multiplicantdivisor*(10ll); 
      } 
      multiplicantincremented++; 
     } 
     else if(multiplicantincremented==multiplicantdivisor) 
      { lenmultiplicant++; 
       multiplicantdivisor=multiplicantdivisor*(10ll); 
      } 
     maxnumofdigitinproduct=lenmultiplicant+lenofn; 
     m=((unsigned long long)n)*multiplicant; 
     length=0; 
     sum=0ll; 
     product=1ll; 
     divisor=10ll; 
     do 
     { quotient=m/divisor; 
      length++; 
      digit=(m%divisor)/(divisor/(10ll)); 
      divisor=divisor*(10ll); 
      if(digit==0) 
      { product=0ll; 
       break; 
      } 
      else 
      { 
       sum=sum+((unsigned long long)digit); 
       product=product*((unsigned long long)digit); 
       if((sum<product) && (sum+((unsigned long long)maxnumofdigitinproduct)-((unsigned long long)length)<product)) 
       { 
        product=0ll; 
        break; 
       } 
      } 
     }while(quotient!=(0ll)); 
     if((sum>=product)&&(product!=(0ll))) 
      flag=1; 
     pthread_mutex_lock(&timeisup); 
     if(bye==1) 
     { pthread_mutex_unlock(&timeisup); 
      pthread_exit(NULL); 
     } 
     else 
      pthread_mutex_unlock(&timeisup); 
    } 
    gettimeofday(&end, NULL); 
    interval=(float)(end.tv_sec*micro_second_multiplier+end.tv_usec - begin.tv_sec*micro_second_multiplier-begin.tv_usec); 
    done=1; 
    printf("\nn=%d m=%llu length=%d %.f millisecond = %.f second done=%d",n,m,length,interval,interval/1000,done); 
} 

int main(void) 
{ pthread_t sa; 
    int err_pthread,count; 
    FILE *fi; 
    fi=fopen("log.txt","a+"); 
    for(n=1;n<=30000;n++) 
    { if(n%10==0) 
      n++; 
     printf("\nTrying n=%d",n); 
     done=0; 
     bye=0; 
     err_pthread=pthread_create(&sa,NULL,&solveforn,NULL); 
     if(err_pthread!=0) 
       { printf("\nError while creating pthread for n=%d",n); 
     } 
     else 
     { printf("\npthread created"); 
      pthread_join(sa,NULL); 
      count=0; 
      do 
      { sleep(1); 
       printf("\n1 second gone"); 
       count++; 
      }while((done!=1) && (count<5)); 
      if(done==1) 
      { fprintf(fi,"\nn=%d m=%llu length=%d %.f millisecond = %.f second",n,m,length,interval,interval/1000); 
       printf("\nThread finished in < 5 seconds"); 
      } 
      else 
      { fprintf(fi,"\nTIME LIMIT EXCEEDED IN N=%d",n); 
       printf("\nTIME LIMIT EXCEEDED IN N=%d",n); 
       pthread_mutex_lock(&timeisup); 
       bye=1; 
       pthread_mutex_unlock(&timeisup); 
      } 
     } 
    } 
    fclose(fi); 
} 

Точками следует отметить
(1) мьютекс timeisup заблокирован, то данные, проходящие между основной и solveforn делается.
Надеюсь - я могу объяснить свою ситуацию.
Проблемы заключается в том -
выхода следующим
Попытки п = 1
нити создана
Pthread начинается
п = 1 м = 1 длина = 1 28 миллисекунд = 0 второго сделано = 1
1 секунда пошел
темы закончена в < 5 секунд
Попытки п = 2
нити не созданы
ничего


Второй «pthread начинается» не отображается. Спасибо.

ответ

1

Есть несколько решений, таких как pthread_cancel или pthread_kill, но не из них, как вы хотите, стремительно вперед. вы должны реализовать обработчики и ...

Нет безопасного пути для уничтожения нити, созданной pthread (вы спросили о выходе), вы должны реализовать логику выхода внутри вашей функции потока. Также вы можете подождать 5 секунд, если все потоки вышли (изменили флаг с соответствующим мьютексом), вы можете уйти.

For pthread, How to kill child thread from the main thread

cancelling or killing a pthread

Также существует асимметрия блокировки/разблокировки вызовов, в вашем коде, вы заперли pthread_mutex_lock и проверены на свидания == 1, если это мьютекс будет разблокирован, но если bye! = мьютексы никогда не разблокируются, и в следующей итерации вы будете заблокированы mutex_lock, что неверно.

+0

спасибо, что ответили. В моем коде - у меня есть глобальная переменная 'bye', которая устанавливается до нуля до создания потока. Через 5 секунд, если поток не завершил свою работу, тогда основные блокировки времени mutex «превышают» и доходят до 1. Thread проверяет значение байта в каждом цикле обработки. Не могу понять - почему код не работает хоть немного? – user1371666

+0

@ user1371666 Кажется, это нормально, вы должны опубликовать меньшую версию своего кода. –

+0

отредактировал мой код и соответствующий вывод. Если вы используете gcc , то сохраните его как something.c $ gcc something.c -lpthread – user1371666