Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中创建多个线程而不使用睡眠_C_Pthreads_Producer Consumer - Fatal编程技术网

如何在C中创建多个线程而不使用睡眠

如何在C中创建多个线程而不使用睡眠,c,pthreads,producer-consumer,C,Pthreads,Producer Consumer,我的任务是编写一个生产者/消费者程序,其中有多个消费者,每个消费者对应于自己的共享数据结构,而生产者可以访问所有共享数据结构。不管怎么说,我遇到的问题是用自己的结构初始化每个消费者线程;这是通过每个线程获得自己的唯一编号来实现的。也就是说,线程0获取作为参数传入的数字0,线程1获取数字1,等等。但是,我只能通过调用sleep使每个线程获取其唯一的数字 struct SharedData { int isopen; int refcount; // re

我的任务是编写一个生产者/消费者程序,其中有多个消费者,每个消费者对应于自己的共享数据结构,而生产者可以访问所有共享数据结构。不管怎么说,我遇到的问题是用自己的结构初始化每个消费者线程;这是通过每个线程获得自己的唯一编号来实现的。也就是说,线程0获取作为参数传入的数字0,线程1获取数字1,等等。但是,我只能通过调用sleep使每个线程获取其唯一的数字

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);

}

如何在不使用睡眠调用的情况下初始化这些线程

如果您的结构是全局结构,它将在创建Z线程之前更新。也就是说,在第一个线程执行之前,变量
remp->rop
将增加Z倍。

我的结构是在堆上分配的,请检查上面编辑的代码。从我看到的情况来看,所有操作都是声明一个指针
*de
,然后通过指针
*arg
将其设置为指向结构
remp
。我可能错了,但对我来说,它看起来不像是一个新的结构;它只是指向已经存在的
remp
。让我看看是否可以更好地解释它:您有一个结构
remp
,其中有一个变量
rop
。每次生成线程时,都将
remp->rop
设置为要生成的线程的编号。然后将
remp
指针传递给
消费者
。然后,使用者返回参数所指向的结构以获取其编号。但是,
remp->rop
由在线程开始之前创建线程的块更新。由于您传递了一个指针,因此该值不会复制到线程,因此
remp->rop
将是线程开始执行时更新到的数字。我没有包含该代码位,但当我包含usleep()时,它确实能很好地工作call包含usleep调用时它工作的原因是线程可以在产卵器块睡眠时访问
remp->rop
变量。因此,在线程开始执行代码之前,变量不能递增。我建议为每个线程设置一个变量。生成线程是异步的;仅使用1个变量将导致此类问题。
 for (z=0; z<consumerthreads; z++) {
    remp->rop = z;

    pthread_create((Consumer_Threads+z), 0, Consumer, remp);

 }
 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