2016-12-17 3 views
0

Hier ist meine Situationmake pthread exit innerhalb festgelegter Zeit

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; 
    } 
} 

n variable Satz von Haupt ist.
Ähnliches Ergebnis wird von solve_for_n gesetzt
Ich möchte maximal 5 Sekunden pthread geben für das Lösen sonst sollte es beenden.
Es gibt viele weitere n Werte in der Schlange.

Nun, hier ist mein Code

#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); 
} 

Die Punkte sind
(1) Mutex timeisup dann Daten gesperrt, die zwischen Haupt- und solveforn erfolgt.
Hoffnung - ich kann meine Situation erklären.
Das Problem ist, -
Ausgang wird als
folgt zweiten Versuch, n = 1
Pthread erstellt
Pthread beginnt
n = 1 m = 1 Länge = 1 28 Millisekunde = 0 Sekunden DONE = 1
1 gegangen
Thema fertig in < 5 Sekunden
Der Versuch, n = 2
pthread erstellt
nichts


Zweites 'Pthread beginnt' wurde nicht angezeigt. Danke.

Antwort

1

Es gibt einige Lösungen wie pthread_cancel oder pthread_kill, aber keine von ihnen sind stright vorwärts wie Sie wollen. Sie müssen Handler implementieren und ...

Es gibt keinen sicheren Weg zum Töten eines Threads erstellt von PThread (Sie fragte nach Exit), sollten Sie Exit-Logik innerhalb Sie Thread-Funktion implementieren. Auch können Sie 5 Sekunden warten, wenn alle Threads beendet sind (änderte eine Flagge mit entsprechenden Mutex) Sie können weggehen.

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

cancelling or killing a pthread

auch eine Asymmetrie in Schloss gibt es/Entsperren Anrufe, in Ihrem Code Sie pthread_mutex_lock und geprüft 1 bye == gesperrt haben, wenn es der Mutex entsperrt werden ist, aber, tschüss! = der Mutex wird niemals entriegelt und in der nächsten Iteration wirst du von mutex_lock blockiert, was nicht richtig ist.

+0

danke für die antwort. In meinem Code - ich habe eine globale Variable 'tschüss', die vor der Erstellung von Threads auf Null gesetzt wird. Nach 5 Sekunden, wenn der Thread seine Arbeit nicht beendet hat, sperrt die Hauptsperre die Mutex-Zeit und setzt auf 1. Der Thread überprüft den Wert in jeder Verarbeitungsschleife. Kann nicht herausfinden - warum der Code nicht einmal ein wenig läuft? – user1371666

+0

@ user1371666 es scheint in Ordnung, Sie müssen kleinere Version Ihres Codes –

+0

mein Code und entsprechende Ausgabe bearbeitet. Wenn Sie gcc verwenden, dann speichern Sie es bitte als something.c $ gcc something.c -lpthread – user1371666