Вот моя ситуацииделают выход в потоковом фиксированное время
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 начинается» не отображается. Спасибо.
спасибо, что ответили. В моем коде - у меня есть глобальная переменная 'bye', которая устанавливается до нуля до создания потока. Через 5 секунд, если поток не завершил свою работу, тогда основные блокировки времени mutex «превышают» и доходят до 1. Thread проверяет значение байта в каждом цикле обработки. Не могу понять - почему код не работает хоть немного? – user1371666
@ user1371666 Кажется, это нормально, вы должны опубликовать меньшую версию своего кода. –
отредактировал мой код и соответствующий вывод. Если вы используете gcc , то сохраните его как something.c $ gcc something.c -lpthread – user1371666