免费注册 查看新帖 |

Chinaunix

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

求救:信号锁和信号变量的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-05 13:45 |只看该作者 |倒序浏览
先是我的代码:
#include<stdio.h>
#include <time.h>
#include <errno.h>
#include <pthread.h>
#include <unistd.h>
#include <iostream>
#include <string>
using namespace std;


//#define BUFFER_SIZE 8

#define MAXSIZE 200

struct prodcons {
    int buffer[MAXSIZE];
    pthread_mutex_t lock;      //互斥LOCK

    pthread_cond_t notempty;   //缓冲区非空条件判断
    pthread_cond_t notfull;    //缓冲区未满条件判断
    int m_offset;

};

prodcons *b = new prodcons;

void init(struct prodcons * b){
        pthread_mutex_init(&b->lock,NULL);
        pthread_cond_init(&b->notempty,NULL);
        pthread_cond_init(&b->notfull,NULL);

        b->m_offset = 0;
}

void *producer(void*)
{
        const char* data = "01234567890123456789";
        int len = 20;

        while(true)
        {               
                pthread_mutex_lock(&b->lock);

                if(b->m_offset + len >= MAXSIZE)
                {
                        printf("put wait !\n");
                        pthread_cond_wait(&b->notfull, &b->lock) ;
                }

                memcpy(&b->buffer[b->m_offset], data, len);
                b->m_offset += len;   

                pthread_cond_signal(&b->notempty);

                pthread_mutex_unlock(&b->lock);
        }
}

void *consumer(void*)
{   
        while(1)
        {
                pthread_mutex_lock(&b->lock);
                if(b->m_offset<= 10)
                {
                        printf("get wait !\n");
                        pthread_cond_wait(&b->notempty, &b->lock);
                }
       
                memset(b->buffer, 0, 10);
                memcpy(b->buffer, &b->buffer[10], b->m_offset-10);
                b->m_offset -= 10;
                       
                //        memset(&b->buffer[ b->m_offset], 0, MAXSIZE-b->m_offset);

                if(b->m_offset < MAXSIZE/2)
                        pthread_cond_signal(&b->notfull);
                pthread_mutex_unlock(&b->lock);
        }
   
}

int main(void)
{
    pthread_t th_a, th_b;
   
    void *retval;
   
    init(b);
   
    pthread_create(&th_a, NULL, producer, 0);
    pthread_create(&th_b, NULL, consumer, 0);
   
    pthread_join(th_a, &retval);
    pthread_join(th_b, &retval);
   
    return 0;
}

这段代码的意思就是,2个线程来一个共享缓存, 一个线程是用来写,另一个是读。当读满的时候就会wait, 然后等signal, 读的那个线程同理。

首先请各位大侠看看,我这程序写的是否有问题?

其次,我的问题是:如果pthread_mutex_lock(&b->lock);这句话一进线程就有,那岂不是和单线程没什么区别,比如读线程一上锁,写线程就不能工作了,所以是不是应该再有一把锁,这样才能起到多线程的作用?

谢谢!

论坛徽章:
0
2 [报告]
发表于 2008-09-05 17:00 |只看该作者
什么叫和单线程没什么区别?
你是在访问互斥的共享资源,这时候当然不能并发了,必须串行。如果你说“和单线程没什么区别”,是在这个时候,那可以这么认为。

[ 本帖最后由 wishel 于 2008-9-5 17:03 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP