1、 for(count=0;countP_NUMBER;count+) delay_time =(int)(rand()*TIME/(RAND_MAX)+1; sleep(delay_time);tTH%d:job%d delay =%dn,thrd_num,count,delay_time); %d finishedn pthread_exit(NULL);int main() pthread_t threadT_NUMBER; int no=0,res; void * thrd_ret; srand(time(NULL); for(no=0;noT_NUMBER;no+) res=pthre
2、ad_create(&threadno,NULL, thrd_func,(void*)no); if(res!=0)Creay th %d faildn,no); exit(res);successnwaitingn); res=pthread_join(threadno,&thrd_ret); if(!res)t %d joinedn elseT %djoined faildn return 0;4编译、运行方法及结果(抓屏)5结果分析由运行结果可以看出,创建线程、释放资源按照顺序,而每个线程的运行和结束是独立与并行的。实验二(p287: 11-thread_mutex.c)在试验1的基础上
3、通过互斥锁,使原本独立,无序的多个线程能够按顺序进行#define THREAD_NUMBER 3 /*线程数*/#define REPEAT_NUMBER 3 /*每个线程的小任务数*/#define DELAY_TIME_LEVELS 10.0 /*小任务间的最大时间间隔*/pthread_mutex_t mutex;void *thrd_func(void *arg) /线程函数例程 int thrd_num = (int)arg; int delay_time = 0, count = 0; int res;/互斥锁上锁 res = pthread_mutex_lock(&mutex)
4、; if(res)Thread %d is startingn, thrd_num); for(count = 0; count REPEAT_NUMBER; count+) delay_time = (int)(rand() * DELAY_TIME_LEVELS/(RAND_MAX) + 1;tThread %d: job %d delay = %dn,thrd_num, count, delay_time);Thread %d finishednint main(void) pthread_t threadTHREAD_NUMBER; int no = 0, res; pthread_m
5、utex_init(&mutex, NULL); for(no = 0; no #define THREAD_NUMBER 3#define REPEAT_NUMBER 3#define DELAY_TIME_LEVELS 10.0sem_t semTHREAD_NUMBER;void *thrd_func(void *arg)int thrd_num = (int)arg;int delay_time = 0;int count = 0;sem_wait(&semthrd_num);printf(for(count = 0;delay_time = (int)(rand() * DELAY_
6、TIME_LEVELS/(RAND_MAX)+1;sleep(delay_time);pthread_exit(NULL);pthread_t threadTHREAD_NUMBER;int no = 0,res;void * thrd_ret;srand(time(NULL);for(no = 0; no +)sem_init(&semno, 0, 0);res = pthread_create(&if(res != 0 )exit(res);sem_post(&semTHREAD_NUMBER - 1);for( no = THREAD_NUMBER-1; no = 0;res = pth
7、read_join(threadno, &if(!elsesem(no + THREAD_NUMBER-1)%THREAD_NUMBER); no+)sem_destroy(&semno);return 0;程序运行、结束都是按照顺序进行的,只是顺序和创建的顺序刚好相反。实验四(p295: 11-thread_attr.c)创建一个线程,具有绑定和分离属性,主线程通过finishflag 标志变量来获得线程结束的消息,不调用pthread_join函数#define DELAY_TIME_LEVELS 10.0int finish_flag = 0;Th is startingnfor(cou
8、nt=0;delay_time = (int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX) + 1);tTh :,count,delay_time);Th finishednfinish_flag = 1;pthread_t thread;pthread_attr_t attr;res = pthread_attr_init(&attr);Create attribute failednres = pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);res += pthread_attr_setdetachstate
9、(&attr, PTHREAD_CREATE_DETACHED);if(res!Setting attribute failednth, &attr, thrd_func, NULL);Create th failedn pthread_attr_destroy(&Create th successnwhile(!finish_flag)Waiting for th to finish.nsleep(2);由结果可以看出,这个创建的线程具有绑定好而分离属性,而且主线程通过一个finish_glag标志变量赖获得线程结束的消息,但是线程在运行结束之后似乎没有收回系统资源,因为程序运行前和程序运行
10、后使用“free”命令查看内存使用情况,发现使用的内存并不一致。实验五(p298: 11-producer-customer.c)信号量的意义,在程序生产中和消费过程中是随机进行的,而且生产者的速度比消费者的速度平均快两倍。生产者一次生产一个单元产品,消费者一次消费一个单元的产品。unistd.hfcntl.herrno.hsys/ipc.h#define MYFIFO myfifo#define BUFFER_SIZE 3#define UNIT_SIZE 5#define RUN_TIME 30#define DELAY_TIME_LEVELS 5.0int fd;time_t end_t
11、ime; sem_t mutex,full,avail;void *producer(void *arg)int real_write;int delay_time=0;while(time(NULL)end_time)delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX)/2.0)+1;avail);nProducer: delay = %dn, delay_time);if(real_write=write(fd,hello,UNIT_SIZE)=-1)if(errno=EAGAIN)The FIFO has not been read y
12、et.Please try latternWrite %d to the FIFOn, real_write);full);void *customer(void *arg)unsigned char read_bufferUNIT_SIZE;int real_read;int delay_time;delay_time=(int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX)+1;memset(read_buffer,0,UNIT_SIZE);nCustomer:,delay_time);if(real_read = read(fd,read_buffer,UNIT
13、_SIZE)=-1)No data yetnRead %s from FIFOn,read_buffer);pthread_t thrd_prd_id,thrd_cst_id;pthread_t mon_th_id;int ret;end_time=time(NULL)+RUN_TIME;if(mkfifo(MYFIFO,O_CREAT|O_EXCL)0)&(errno != EEXIST)Cannot create fifonreturn errno;fd = open(MYFIFO,O_RDWR);if(fd=-1)Open fifo errornreturn fd;ret = sem_i
14、nit(&mutex,0,1);ret += sem_init(&avail,0,BUFFER_SIZE);full,0,0);if(ret !Any semaphore initialization failednreturn ret;ret = pthread_create(&thrd_prd_id,NULL,producer,NULL);if(ret!Create producer thread errornthrd_cst_id,NULL,customer,NULL);Create customer thread errornpthread_join(thrd_prd_id,NULL);pthread_join(thrd_cst_id,NULL);close(fd);unlink(MYFIFO);由实验结果可以看出生产者的速度比消费者的速度平均快2倍左右。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1