多线程一个错误的例子

见源码:



/*********    说明:
*********    1.要让读者与写者之间、以及写者与写者之问要互斥地访同数据集;
*********    2.在无写进程到来时各读者可同时访问数据集;
*********    3.在读者和写者都等待时访问时写者优先.
*********/

#include <pthread.h>
#include <signal.h>
#include <stdio.h>
//#include "apue.h"

#define R 5 // reader NO.
#define W 5 // reader and writer NO.

pthread_mutex_t critical = PTHREAD_MUTEX_INITIALIZER; //保护临界资源互斥
pthread_mutex_t rd = PTHREAD_MUTEX_INITIALIZER; //保护读互斥
pthread_mutex_t wr = PTHREAD_MUTEX_INITIALIZER; //保护写互斥
pthread_mutex_t priority = PTHREAD_MUTEX_INITIALIZER;//读写互斥

int readCount = 0; //临界资源
int writeCount = 0; //临界资源

void* reader(void *arg)
{
    int n = W;
    int id = *(int *)arg;
    while (1)
    {
         sleep(rand()%3);
         readCount++; //对于临街资源必须做到互斥访问,同一时间只有一个线程在操作.
         if(readCount == 1){
             printf("AAAAAAAAA\n");
             pthread_mutex_lock(&critical);
         }
         readCount--;
         sleep(rand()%3);
         if(readCount == 0){
             printf("BBBBBBB\n");
             pthread_mutex_unlock(&critical);
         }
    }
    printf("-----reader %d has done ----, current read count[%d]\n", id, readCount);
}

void *writer(void *arg)
{
     int n = W;
     while(1)
     {
         sleep(rand()%3);
         pthread_mutex_lock(&wr);
         pthread_mutex_lock(&critical); //写线程之间也是互斥的.
         printf("\twriter is writing\n");
         pthread_mutex_unlock(&critical);
         pthread_mutex_unlock(&wr);
     }
     printf("-----writer has done -----\n");
}

int main(int argc, const char *argv[])
{
     int err;
     pthread_t tid[R], writerTid;
     int i= 0;
     //for(i; i < W; ++i){
         err = pthread_create(&tid[i], NULL, reader, &i);
         if (err != 0)
         {
             printf("can‘t create process for reader");
         }
     //}

     err = pthread_create(&writerTid, NULL, writer, (void *)NULL);
     if (err != 0)
     {
          printf("can‘t create process for writer");
     }

     while(1);
     return 0;
}

编译运行:

AAAAAAAAA
    writer is writing
BBBBBBB
AAAAAAAAA
BBBBBBB
    writer is writing
    writer is writing
    writer is writing
AAAAAAAAA
    writer is writing
BBBBBBB
    writer is writing
    writer is writing
AAAAAAAAA
BBBBBBB
AAAAAAAAA
    writer is writing
BBBBBBB
    writer is writing
AAAAAAAAA
BBBBBBB
AAAAAAAAA
    writer is writing
BBBBBBB
    writer is writing
AAAAAAAAA
BBBBBBB

见上面的红色部分,之前一直以为write一定会执行在BBBB后面,因为打印完"BBBBBB"后才会释放锁.

但是这些writing 的输出其实是在"AAAAA"打印完成之后和获取锁之前执行的,write线程里面的代码和read线程代码并没有先后顺序的关系.加上锁只能让他们访问资源时互斥,并不能做到同步.

时间: 2024-08-27 10:30:41

多线程一个错误的例子的相关文章

java 多线程——一个定时调度的例子

java 多线程目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 学习了一段时间的多线程内容,项目中有个定时调度的需求,将之前的需求重新梳理了下,写了一个多线程调用的例子,加深学习. 定时调度的需求如下:设定任务的开始时间,分为单次调度和循环调度,访问指定的url. java 多线程--一个定时调度的例子

VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误

今天在用 VS2013 C# 调用 cognex 的QuickBuild做程序时发生一个错误,如下所示 混合模式程序集是针对"v2.0.50727"版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集 网上搜索得到解决办法: 在app.config中添加一个配置节:startup <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime

【Python】一个简单的例子

问题描述: Python基础篇 参考资料: (1)http://www.cnblogs.com/octobershiner/archive/2012/12/04/2801670.html (2)http://www.cnblogs.com/itech/archive/2010/06/20/1760345.html 例子: 求解Fibonacci glb_var.py gl_count=1 path.py # coding:utf-8 ''' Created on 2014-4-28 @autho

【转】用JSON报的一个错误java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeExcept

来源:http://blog.csdn.net/eilent/article/details/6927700 出现错误的原因是因为jar包导入不全. 今天自己写了一个JSON的例子,可以一调用就出了问题,报下面这个异常: java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException 上网上搜了一下才知道原来在使用JSON的使用的时候,不光要导入JSON这个包,同时还要导入另

Spring中的一个错误:使用Resources时报错(The annotation @Resources is disallowed for this location)

在学习Spring的过程中遇到一个错误:在使用注解@resources的时候提示:The annotation @Resources is disallowed for this location 后来来在学问Java网友的时候解决了. 原来的代码是这样的: 1 package com.show.biz; 2 3 import javax.annotation.Resources; 4 5 import com.show.biz.UserBiz; 6 import com.show.dao.Us

jsonkit 分解nsarray 时刻 一个错误

jsonkit 分解nsarray 时刻 一个错误 Assertion failure in -[TXJKArray count], /Users/mqq/hudson/1740/src/TencentOpenApi_IOS/Common/Util/JSONKit.m:738 解决的方法: Had the same issue, I was trying to set the output straight to a dictionary I had created. myDictionary

转:《链接、装载与库》里的一个错误:关于调用栈

<链接.装载与库>里的一个错误:关于调用栈 按照原文中描述做了一个PPT: 每次执行push指令时,esp都会减4(因为栈是向低地址增长的),每次pop时esp都会加4. 指令:push a 指令:push b 指令: 1.把main方法当前指令的下一条指定地址(即return address))push到栈中. 2.使用call指令调用目标函数体. 指令:将ebp的当前值push到栈中,即saved ebp. 指令:将esp的值赋给ebp,则意味着进入了foo方法的调用栈. 指令:push

处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”

开发web项目时需要安装IIS,在安装好IIS的Windows7本上发布asp.net网站时,web程序已经映射到了本地IIS上,但运行如下错误提示"处理程序"PageHandlerFactory-Integrated"在其模块列表中有一个错误模块"ManagedPipelineHandler"" 我要发布的的web项目开发工具及所用系统 ①开发工具:vs2010.数据库:sqlserver ②操作系统:windows7 ③IIS:IIS 7.5

spring-framework-3.2.4.RELEASE 综合hibernate-release-4.3.5.Final一个错误Caused by: java.lang.NoClassDefFound

LZ一体化的今天spring-framework-3.2.4.RELEASE 综合hibernate-release-4.3.5.Final一个错误Caused by: java.lang.NoClassDefFound Caused by: java.lang.NoClassDefFoundError: org/hibernate/service/jta/platform/spi/JtaPlatform. 最后从国外一篇文章找到解决的方法:原文地址例如以下:点击打开链接 产生原因是: Hibe