【发布时间】:2014-04-14 21:24:23
【问题描述】:
我的任务是编写一个生产者/消费者程序,其中有多个消费者,每个消费者对应于自己的共享数据结构,而生产者可以访问所有共享数据结构。无论如何,我遇到的问题是用自己的结构初始化每个消费者线程;这是通过每个线程获得自己的唯一编号来实现的。 IE,线程 0 获取作为参数传入的数字 0,线程 1 获取数字 1,等等。但是,我只能通过调用睡眠来让每个线程获取其唯一的数字。
struct SharedData {
int isopen;
int refcount; // reference count: number of threads using this object
unsigned int front; // subscript of front of queue
unsigned int count; // number of chars in queue
unsigned int bufsize;
pthread_cond_t buffer_full;
pthread_cond_t buffer_empty;
pthread_mutex_t mtex;
fifo_t* queue;
sem_t empty_count;
sem_t full_count;
sem_t use_queue; // mutual exclusion
};
struct OverSharedData{
struct SharedData ** rep;
int rop;
};
int main(int argc, const char *argv[])
//Other Code
struct OverSharedData* remp = (struct OverSharedData*)malloc(sizeof(struct OverSharedData));
rennit(remp);
struct SharedData * d = *(remp->rep + 0);
//Other Code
for (z=0; z<consumerthreads; z++) {
remp->rop = z;
pthread_create((Consumer_Threads+z), 0, Consumer, remp);
usleep(100);
}
remp->rop 是包含其特定编号的每个线程的不同参数。如果我这样注释掉usleep
for (z=0; z<consumerthreads; z++) {
remp->rop = z;
pthread_create((Consumer_Threads+z), 0, Consumer, remp);
}
我明白了:进入的消费者:2
进入的消费者:2
进入的消费者:2
当我想要时: 进入消费者:0 进入消费者:1 进入消费者:2
消费者代码在这里:
void* Consumer(void *arg){
pthread_mutex_lock(&grill);
struct OverSharedData * de = (struct OverSharedData *)arg;
printf("Entered Consumer: %d\n", de->rop);
int numb = de->rop;
pthread_mutex_unlock(&grill);
//Rest of code not necessary
如何在不使用睡眠调用的情况下初始化这些线程
【问题讨论】:
标签: c pthreads producer-consumer