- 论坛徽章:
- 0
|
先是我的代码:
#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);这句话一进线程就有,那岂不是和单线程没什么区别,比如读线程一上锁,写线程就不能工作了,所以是不是应该再有一把锁,这样才能起到多线程的作用?
谢谢! |
|