免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1226 | 回复: 2
打印 上一主题 下一主题

[学习分享] Linux多线程菜鸟求助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-18 10:40 |只看该作者 |倒序浏览
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

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:%d\n",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:%d\n",tickets);   
    tickets--;
          }

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

论坛徽章:
0
2 [报告]
发表于 2014-09-18 12:27 |只看该作者
本帖最后由 kartorz 于 2014-09-18 12:30 编辑

不知道你的代码是否贴得完整,看起来有很多问题:
1:  > pthread_mutex_t counter_lock;  
        >pthread_cond_t counter_nonzero;
       都没有初始化, lock 和cond 不进行初始化,是不能直接使用的。
       你需要先使用 pthread_mutex_init     pthread_cond_init 进行初始化。

2: decrease_counter  与 increase_counter的逻辑是一样的,估计是copy 代码了后,没有修改。

3: 线程函数里面, "else   break ", 会直接跳出 while, 没有机会执行 unlock。

论坛徽章:
0
3 [报告]
发表于 2014-09-18 15:51 |只看该作者
回复 2# kartorz


    综合大家的意见后,我把程序改动如下:主要实现功能是线程1读取数据,主线程计算数据,主线程要等待线程1读取完再开始计算,共读取5次,不知道这样的代码对不对?另外读取数据的线程如果不加延时可不可以呢?
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>

pthread_mutex_t counter_lock;
pthread_cond_t counter_nonzero;

int i;

void *thread_read(void *argv);

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

    pthread_mutex_init(&counter_lock, NULL);  
    pthread_cond_init(&counter_nonzero, NULL);

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

    for(i = 0;i < 5;i++)
    {
        pthread_mutex_lock(&counter_lock);
pthread_cond_wait(&counter_nonzero, &counter_lock); //进入阻塞(wait),等待激活(signal)
//compute data here
        printf("main_thread compute data:%d\n",i);   

pthread_mutex_unlock(&counter_lock);
    }

    return 0;
}

void *thread_read(void *argv)
{
    while(i < 5)
    {
       pthread_mutex_lock(&counter_lock);
       //read data here
       printf("Thread_read read data:%d\n",i);

       pthread_cond_signal(&counter_nonzero); //激活(signal)阻塞(wait)的线程(先执行完signal线程,然后再执行wait线程)
       pthread_mutex_unlock(&counter_lock);
       usleep(10);
    }
}
这是执行结果
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP