【发布时间】:2016-12-17 12:54:01
【问题描述】:
这是我的情况
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 是 main 设置的变量。
solve_for_n 设置类似的结果
我想给 pthread 最多 5 秒的时间来解决,否则它应该退出。
还有更多 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)mutex timeisup 锁定,然后在 main 和 solveforn 之间传递数据。
希望-我能够解释我的情况。
问题是 -
输出如下
尝试 n=1
pthread 创建
Pthread 开始
n=1 m=1 长度=1 28 毫秒 = 0 秒完成=1
1秒过去了
线程在 尝试 n=2
pthread 创建
什么都没有
第二个“pthread 开始”没有出现。
谢谢。
【问题讨论】:
标签: pthreads