Chinaunix首页 | 论坛 | 博客
  • 博客访问: 690320
  • 博文数量: 214
  • 博客积分: 5015
  • 博客等级: 大校
  • 技术积分: 2285
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-18 17:02
文章分类

全部博文(214)

文章存档

2008年(43)

2007年(171)

我的朋友

分类:

2007-12-02 17:31:45

About Mutex

mutex是一个互斥锁对象,互斥锁是为了防止多线程同时修改某一公共资源,我在下面的程序里把它“锁”在了一个叫buffer[10]的缓冲区上,模型是2个Reader和2个Writer,Reader要等到叫buffer的书架上有书的时候才可以read,而Writer也必须在书架没有放满的情况下才可以把新写的书放到书架上。我的程序里书架的大小是1,当然也可以设置书架的大小,不过实现过程大同小异。就不多说了。来看程序:

      1 #include <stdio.h>
      2 #include <pthread.h>
      3
      4 void reader_function(void);
      5 void writer_function(void);
      6
      7 char buffer[10]={0};
      8 int buffer_has_item=0;
      9 pthread_mutex_t mutex;
     10
     11 int main(void)
     12 {
     13 pthread_t reader;
     14
     15 /* 用默认属性初始化一个互斥锁对象*/
     16 pthread_mutex_init (&mutex,NULL);
     17 pthread_create(&reader,NULL, (void *)reader_function, NULL);
     18 writer_function();
     19 }
     20
     21 void writer_function(void)
     22 {
     23 int i,ti;
     24
     25 for(i=1;i<3;)
     26 {
     27 ti=i;
     28 /* 锁定互斥锁*/
     29 pthread_mutex_lock(&mutex);
     30 printf("Writer %d Locked Buffer.\r\n",i);
     31 if (buffer_has_item==0)
     32 {
     33 buffer_has_item=1;
     34 strcpy(buffer,"Full");
     35 printf("++Writer %d fill the buffer with context \"%s\".\r\n",i,buffer);
     36 i++;
     37 }
     38 /* 打开互斥锁*/
     39 printf("Writer %d Unlocked Buffer.\r\n\n\n",ti);
     40 pthread_mutex_unlock(&mutex);
     41 sleep(1);
     42 }
     43
     44 }
     45
     46 void reader_function(void)
     47 {
     48 int i,ti;
     49 for(i=1;i<3;)
     50 {
     51 ti=i;
     52 pthread_mutex_lock(&mutex);
     53 printf("Reader %d Locked Buffer.\r\n",i);
     54 if(buffer_has_item==1)
     55 {
     56 buffer_has_item=0;
     57 strcpy(buffer,"Empty");
     58 printf("--Reader %d clean the buffer with context \"%s\".\r\n",i,buffer);
     59 i++;
     60 }
     61 printf("Reader %d Unlocked Buffer.\r\n\n\n",ti);
     62 pthread_mutex_unlock(&mutex);
     63 sleep(1);
     64 }
     65
     66 }
     67

编译:gcc -o mutex -lpthread -g mutex.c
运行:./mutex
结果:
Reader 1 Locked Buffer.
Reader 1 Unlocked Buffer.


Writer 1 Locked Buffer.
++Writer 1 fill the buffer with context "Full".
Writer 1 Unlocked Buffer.


Writer 2 Locked Buffer.
Writer 2 Unlocked Buffer.


Reader 1 Locked Buffer.
--Reader 1 clean the buffer with context "Empty".
Reader 1 Unlocked Buffer.


Writer 2 Locked Buffer.
++Writer 2 fill the buffer with context "Full".
Writer 2 Unlocked Buffer.


Reader 2 Locked Buffer.
--Reader 2 clean the buffer with context "Empty".
Reader 2 Unlocked Buffer.

注意,这次用到的sleep()不再是为了让结果好看,而是为了防止一个线程始终占用资源,很多网上的教程使用的是pthread_delay_np(&delay);这个语句,不过这个似乎只能在solaris系统上用,linux还是用sleep()和usleep()好了,有高人说可能会使该线程所在的进程都sleep,我使用下来似乎没有发现。而且似乎linux下本来就是一个进程里只有一个线程,忘记哪个手册上说的,也许是以前的版本,不追究了,能用就行。

还有就是在reader()和writer()里,我用了很奇怪的 i 和 ti 两个变量来对reader和writer编号,主要目的是为了保证每个Reader和Writer都能完成自己的使命,如果按照常规写法,使用for(i=1;i<3;i++)这样控制循环会使有的Reader或者Writer不能取到或者放上书。似乎说得自己都迷糊了,举例说,Reader1去取书,恰巧这时候书架上是空的,为了保证Reader1能取到书,我就让Reader们排队,直到Reader1取到以后才轮到Reader2,对于Writer们也实行排队.

阅读(492) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~