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.
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
@ user1371666 es scheint in Ordnung, Sie müssen kleinere Version Ihres Codes –
mein Code und entsprechende Ausgabe bearbeitet. Wenn Sie gcc verwenden, dann speichern Sie es bitte als something.c $ gcc something.c -lpthread – user1371666