c - 如何在 C 中不使用 sleep 创建多个线程

标签 c pthreads producer-consumer

我的任务是编写一个生产者/消费者程序,其中有多个消费者,每个消费者对应于它自己的共享数据结构,而生产者可以访问所有共享数据结构。无论如何,我遇到的问题是用自己的结构初始化每个消费者线程;这是通过每个线程获得自己的唯一编号来实现的。 IE,线程 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);

}

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

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

最佳答案

如果您的结构是全局的,它将在创建 Z 线程之前得到更新。 IE。甚至在第一个线程执行之前,变量 remp->rop 将递增 Z 次。

关于c - 如何在 C 中不使用 sleep 创建多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23070720/

相关文章:

c - 将结构数组作为参数输入 pthread_create 时出现问题

c - 我的 Posix 线程在没有信号的情况下唤醒

c# - 使用 BlockingCollection<T> 作为单一生产者、单一消费者 FIFO 查询是否好?

c - C语言中的switch语句

c - 如何在没有循环的情况下将数组初始化为 C 中的某物?

c - 处理指针数组

c# - RabbitMQ 在一个连接内发送和消费消息

c - 我的代码给出了 Linux 上的环境变量

c - 使用 C 中的宏初始化未知大小的二维数组

c - 管道无法通过 pthread_t 工作