当前位置:  技术问答>linux和unix

Linux多线程菜鸟求助

    来源: 互联网  发布时间:2017-05-29

    本文导语:  本帖最后由 download_cs 于 2014-09-18 09:58:11 编辑 #include  #include  #include  pthread_mutex_t counter_lock; pthread_cond_t counter_nonzero; int estatus = -1; int tickets = 100; void *decrement_counter(void *argv); void *increment_counter(void *argv); int...

本帖最后由 download_cs 于 2014-09-18 09:58:11 编辑
#include 
#include 
#include 

pthread_mutex_t counter_lock;
pthread_cond_t counter_nonzero;

int estatus = -1;
int tickets = 100;

void *decrement_counter(void *argv);
void *increment_counter(void *argv);

int main(int argc, char **argv)
{
    pthread_t thd1, thd2;
    int ret;

    ret = pthread_create(&thd1, NULL, decrement_counter, NULL);
    if(ret){
        perror("del:n");
        return 1;
    }

    ret = pthread_create(&thd2, NULL, increment_counter, NULL);
    if(ret){
        perror("inc:n");
        return 1;
    }

    sleep(10);

    return 0;
}

void *decrement_counter(void *argv)
{
    while(1)
    {
        pthread_mutex_lock(&counter_lock);
        if(tickets > 0)
        {
          // usleep(100);
           printf("Thread1 sell ticket:%dn",tickets);  
   tickets--; 
       }
       else
           break;
       pthread_cond_wait(&counter_nonzero, &counter_lock); //进入阻塞(wait),等待激活(signal)
       pthread_mutex_unlock(&counter_lock); 

    }
    return &estatus;
}

void *increment_counter(void *argv)
{
      while(1)
      {
         pthread_mutex_lock(&counter_lock);
         if(tickets > 0)
          {
          //  usleep(100);
            printf("Thread2 sell ticket:%dn",tickets);   
    tickets--;
          }

       else
           break;
        pthread_cond_signal(&counter_nonzero); //激活(signal)阻塞(wait)的线程(先执行完signal线程,然后再执行wait线程)
        pthread_mutex_unlock(&counter_lock);
      }
    return &estatus;
}
程序代码如上,输出结果列出如下:为什么不是线程1和2交替运行呢?大部分是线程2在运行,求大神指点,还是我对多线程理解有问题?
Linux多线程菜鸟求助[图片]Linux多线程菜鸟求助[图片]

|
pthread_cond_signal(&counter_nonzero); //激活(signal)阻塞(wait)的线程(先执行完signal线程,然后再执行wait线程)
pthread_mutex_unlock(&counter_lock);
sleep(2) //Add a sleep here and try again

ur code doesn't give thread 1 time to take over.

P.S., Sleep is not a very robust way to serialize threads

|
break之后没有释放锁

|
延时的作用就是当你这个线程运行完之后  不能让该线程再有时间继续占用互斥锁    另外还应该注意线程的释放    你既然都创建线程了    应该想到用完要去释放它咯   好好学吧     像进程线程IO多路复用都是很常用的东西     其实多练练就行了   没有那么难

    
 
 

您可能感兴趣的文章:

  • 菜鸟的Linux练习疑问……
  • 菜鸟想学linux,终于装上redhat8.0了,linux有可以播放视频的软件吗?在哪里下载??
  • 菜鸟的问题:求助,关于red hat linux 引导程序
  • 新人新年散分混个脸熟,顺便问个菜鸟级LINUX问题
  • linux菜鸟(windows xp与 linux安装问题,急(在线等),现在机器正在罢工)
  • ※菜鸟送分之一※ Red Hat Linux 的最高版本是多少?
  • ★菜鸟问:怎么在RED HAT LINUX7.2中用169上网??
  • 如何解压光盘上的gz文件到某个目录?(Linux 超级菜鸟问题之一)
  • 菜鸟询问:学习linux主要的方向?
  • 超级菜鸟问题:使用VMware安装linux会删除硬盘上的数据吗?
  • Linux菜鸟三求!
  • linux菜鸟的安装问题求救!
  • 菜鸟问题,怎样学Linux,
  • 关于linux的菜鸟问题~
  • 菜鸟求助:Linux安装完了不能上网,SOS?
  • Linux安装oracle,菜鸟急用!
  • linux下游戏问题。(菜鸟问题)
  • 菜鸟怎么装linux?
  • 菜菜的菜鸟来请教:Linux系统怎么安装?
  • Linux的菜鸟问题!
  • Windows和Linux下C++类成员方法作为线程函数方法介绍
  • 请问Linux核心支持多线程吗?开发库有线程库吗?线程好用吗?(稳定?)
  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 求个linux多线程编程的例子,要有线程池的 通用些更好
  • 请问Linux下线程开销为什么这么大?一个线程要占用近10M内存
  • Linux多线程时一些线程分不到时间片
  • 说说windows线程和linux线程的区别?
  • linux 下多线程 每个线程能否使用alarm来处理,信号是否会乱呢?
  • linux下,如何在多线程中每个线程设置一个定时器,在线等,急。。。谢谢
  • 在创建linux线程时为什么会多一个线程?
  • linux如何主动将线程放入到线程调度队列中重新排队?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 求助:linux下 vim的配置(高分求助)
  • 求助!为什么linux下FTP允许windows登录而不允许linux登录?在线等
  • 求助关于linux和windows引导lilo的问题
  • 求助!!怎么在linux交叉环境下移植SOAP协议?
  • 新装linux求助
  • 求助:新氧Linux中文定制版V0.1主题包
  • Opengl Linux多线程 求助
  • linux webserver求助一下
  • 100分求助:关于linux下配置sendmail的问题
  • 急求助!安装linux后重装windows的问题
  • 求助,linux下如何使用函数更改时区,例如设置美国时区 谢谢
  • mini2440开发,linux求助
  • linux的 iptables问题求助
  • 求助~~求助 ~~linux文件读写问题
  • 求助:linux系统断电后无法正常启动
  • 求助访问linux下jboss应用程序?
  • linux配置samba服务器求助!!!
  • 【求助】如何通过外网访问Linux服务器?
  • 求助,在Linux下当文件夹大小超过1G时,删除文件夹内容
  • 急!!!小弟刚刚接触linux 在线求助<很简单的问题>
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3