【问题标题】:How to create multiple threads without using sleep in C如何在不使用睡眠的情况下在 C 中创建多个线程
【发布时间】: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


    【解决方案1】:

    如果你的结构是全局的,它会在 Z 线程被创建之前被更新。 IE。在第一个线程执行之前,变量remp-&gt;rop 将被递增 Z 次。

    【讨论】:

    • 我的结构是在堆上分配的,检查上面的编辑代码
    • 据我所知,所做的只是声明了一个指针*de,然后通过指针*arg 将其设置为指向结构remp。我可能错了,但对我来说,它看起来不像是一个新的结构;它只是指向已经存在的remp
    • 让我看看能否更好地解释一下:你有一个结构体remp,其中有一个变量rop。每次生成线程时,将remp-&gt;rop 设置为要生成的线程的编号。然后将remp(一个指针)传递给Consumer。消费者然后回顾参数指向的结构以获取其编号。但是,remp-&gt;rop 在线程启动之前由创建线程的块更新。由于您传递了一个指针,因此该值不会复制到线程,因此remp-&gt;rop 将是线程开始执行时它更新的数字。
    • 我没有包含那部分代码,但是当我包含 usleep() 调用时它确实可以正常工作
    • 包含 usleep 调用时它起作用的原因是,当您的 spawner 块处于睡​​眠状态时,线程可以访问 remp-&gt;rop 变量。因此,在您的线程开始执行代码之前,该变量不能递增。我建议为每个线程设置一个变量。产生线程是异步的;仅使用 1 个变量会导致此类问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2013-03-05
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多