题目描述:警察和小偷被手铐绑在一起,需要共同逃亡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 #include2 #include 3 #include 4 #include 5 #include 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 run 20 if(my_thief+rand1 3) //run 21 my_thief+=rand1; 22 else 23 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 run 38 if(my_police+rand2 3) //run 39 my_police+=rand2; 40 else 41 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 else 59 printf("the first come is the thief\n"); 60 break; 61 } 62 } 63 64 return 0; 65 }