Linux多线程菜鸟求助

download_cs 2014-09-18 09:52:11
#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在运行,求大神指点,还是我对多线程理解有问题?
...全文
316 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fortunate1y 2014-09-24
  • 打赏
  • 举报
回复
引用 8 楼 fortunate1y 的回复:
这个函数有问题:

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;    // break是跳出while循环了(这也是if与switch的主要区别)
                          //你的while语句中最后的 cond_signal 和 mutex_unlock都没有执行。
        pthread_cond_signal(&counter_nonzero); //激活(signal)阻塞(wait)的线程(先执行完signal线程,然后再执行wait线程)
        pthread_mutex_unlock(&counter_lock);
      }
    return &estatus;
}
楼主是对的,刚才看错了。囧
fortunate1y 2014-09-24
  • 打赏
  • 举报
回复
这个函数有问题:

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;    // break是跳出while循环了(这也是if与switch的主要区别)
                          //你的while语句中最后的 cond_signal 和 mutex_unlock都没有执行。
        pthread_cond_signal(&counter_nonzero); //激活(signal)阻塞(wait)的线程(先执行完signal线程,然后再执行wait线程)
        pthread_mutex_unlock(&counter_lock);
      }
    return &estatus;
}
download_cs 2014-09-23
  • 打赏
  • 举报
回复
谢谢各位,明白了
河南智学未来 2014-09-19
  • 打赏
  • 举报
回复
延时的作用就是当你这个线程运行完之后 不能让该线程再有时间继续占用互斥锁 另外还应该注意线程的释放 你既然都创建线程了 应该想到用完要去释放它咯 好好学吧 像进程线程IO多路复用都是很常用的东西 其实多练练就行了 没有那么难
  • 打赏
  • 举报
回复
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
download_cs 2014-09-18
  • 打赏
  • 举报
回复
综合大家的意见后,我把程序改动如下:主要实现功能是线程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);
}
}
这是执行结果
download_cs 2014-09-18
  • 打赏
  • 举报
回复
引用 2 楼 u014260236 的回复:
break之后没有释放锁
嗯 说的是啊
download_cs 2014-09-18
  • 打赏
  • 举报
回复
引用 1 楼 micropentium6 的回复:
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
延时确实有用,谢谢
Misslio 2014-09-18
  • 打赏
  • 举报
回复
break之后没有释放锁

23,128

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧