筛质数的例子 201个进程。用指定n个进程筛质数。

cp ../../process_basic/primer0.c ./放到当前路径下

现在的计算范围,thrnum :right-left右边界-左边界

  • 思路:main当中,一个人干活 计算,现在希望每有一个待计算的i值用一个线程去做 for循环里的工作 用一个函数。main创建线程 兄弟 没有主次之分。
int main()
{
	int i,err;
	pthread_t tid[THRNUM]; //需要的参数 create
	for(i=LEFT;i<=RIGHT;i++)
	{
		err=pthread_create(&tid+(i-LEFT),NULL,thr_prime,&i);
		if(err)
		{
			fprintf(stderr,"pthread_create():%s\n",stderror(err));
			exit(1);  //join 收尸 如果 最后一个线程失败 需要将前面的回收资源
		}
	}
	
	//收尸
	for(i=LEFT;i<=RIGHT;i++)
		pthread_join(tid[i-LEFT],NULL);
 
	exit(0);
}
 
static void *thr_prime(void *p)
{
	int i,j,mark;
	i = *(int *)p;
	mark=1;
	//是质数的话输出 不是的话算了
	for(j=2; j<i/2;j++)
	{
		if(i%j == 0)
		{
			mark=0;
			break;
		}
	}
	if(mark)
		printf("%d is a primer\n",i);
	pthread_exit(NULL);
}
 
 

出现竞争 ,非原子操作。 协议 大家的约定。 十字路口 没有红绿灯,两辆车 南北 东西方向 车什么时候到来不知道 异步事件 什么 竞争:在没有约定的情况下 大家在抢同一个资源在用。十字路口 资源 两辆车 不知道是否相撞 无法预料。如何让两辆车不相撞? 最好不要用sleep 无法解决两个问题 等什么 等多久; 哲学问题 那如何让两辆车相撞?加长车长度,sleep 调试手段让线程存在时间增长 等待 测试 。

ps ax -L

错误:地址传参,i 一块地址 用201个指针指向这一块空间 201个人在用同一个地址 传值 可以 丑陋的办法 强转 void* i

看是否有各种形式的退出。 并发:顺序不是 从小到大

./primer0 |wc -l


继续改进:不要强转 201个i在201个空间 捏一个结构体 考虑动态分配 传结构体类型指针

 
struct thr_arg_st
{
	int n;
};
 
 
for
struct thr_arg_st *p;
 
p=malloc(sizeof(*p));
if(p==NULL)
{
	perror("malloc()");
	exit(1);
}
p->n=i;
err=pthread_create(tid+(i-LEFT),NULL,thr_prime,p); 
 
 
i = (struct thr_arg_st*)p->n;
free(p);

但这样做也不好,希望malloc和free在用一个函数当中 或者同一个模块

改 pthread_join pthread_exit 传p

void *ptr;
for(i=LEFT;i<=RIGHT;i++)
{
	pthread_join(tid[i-LEFT],&ptr);
	free(ptr)
}
 
 
---
 
pthread_exit(p);

一个进程中能够创建出的线程个数? 一个函数扔出去很多次,代码段公用 栈独立 ulimt -a 栈 大小 虚拟空间大小,需要看当前空间里可以创建多少10m的栈。取决于外在的资源量。64位 是tid先 消耗掉。128t

资源数 有上限。