首页 > 代码库 > 警察与小偷
警察与小偷
题目描述:警察和小偷被手铐绑在一起,需要共同逃亡100m,手铐长度3m。
可以参考 生产者消费者模型
线程问题,理解线程,多线程
运行环境为pthreads-w32 release 2.8.0+codeblocks,pthread在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。Windows操作系统也有其移植版pthreads-win32。
主要难点在编译运行环境的搭建,程序很简单,大家一看应该就会明白,也没有多少行代码
pthread是Linux下对进程管理的操作,虽然Windows操作系统也有其移植版pthreads-win32,但要运行pthread程序还要对编译器进行一下必要的配置
1、下载pthreads-win32 即pthreads-w32-2-8-0-release
此文件我上传到了csdn上,大家可以自行下载:http://download.csdn.net/detail/karma_w/8154507
2、将解压后的pre-bjuild.2(预编译文件夹)下的lib和inlcude文件夹里面的内容复制到codebloks的lib和include文件夹下
3、将解压后的pre-bjuild.2下的lib中pthreadVC2.dll复制到你所建立的工程文件中作为动态链接库
4、对编译环境进行配置:setting->compiler->Linker settings->add添加库文件,即lib下的pthreadVC2.a、pthreadVCE2.a、pthreadVSE2.a库文件,配置完成,编译
代码如下:使用了进程互斥锁mutex,创建了两个进程void *thief(void *args)和void *police(void *args),利用随机数种子产生1-6的随机数,即警察或小偷的一次最大前进距离为6米,假设其中一人落后3米,即可前进6米
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 #include <time.h> 5 #include <windows.h> 6 7 int my_thief=0; 8 int my_police=0; 9 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;10 11 /**thief go first and police follow**/12 void *thief(void *args)13 {14 int rand1;15 while(1){16 pthread_mutex_lock(&mutex);17 srand((unsigned)time(NULL));/**随机种子**/18 rand1=rand()%6+1;19 if(my_thief-my_police<3){ //thief can run20 if(my_thief+rand1<my_police+3) //run21 my_thief+=rand1;22 else23 my_thief=my_police+3;24 }25 printf("thief:%d\n",my_thief);26 pthread_mutex_unlock(&mutex);27 Sleep(500);28 }29 }30 void *police(void *args)31 {32 int rand2;33 while(1){34 pthread_mutex_lock(&mutex);35 srand((unsigned)time(NULL));/**随机种子**/36 rand2=rand()%6+1;37 if(my_police-my_thief<3){ //thief can run38 if(my_police+rand2<my_thief+3) //run39 my_police+=rand2;40 else41 my_police=my_thief+3;42 }43 printf("police:%d\n",my_police);44 pthread_mutex_unlock(&mutex);45 Sleep(500);46 }47 }48 int main()49 {50 pthread_t t1,t2;51 pthread_create(&t1,NULL,thief,NULL);52 pthread_create(&t2,NULL,police,NULL);53 54 while(1){55 if(my_police>=100 || my_thief>=100){56 if(my_police>my_thief)57 printf("the first come is the police\n");58 else59 printf("the first come is the thief\n");60 break;61 }62 }63 64 return 0;65 }
警察与小偷