当前位置: 首页 > 知识库问答 >
问题:

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

姚淳
2023-03-14

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

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

共有1个答案

瞿宏儒
2023-03-14

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

 类似资料:
  • react文档中提到了创建react应用程序的官方方法 我认为会自动检测纱线,但在我的情况下,它不会,并使用我不想要的npm创建reactapp。 我使用创建react-app的第二个选项,但它显示了多个警告: 那么有没有更好的方法用npx(使用纱线)创建react应用程序

  • 问题内容: 有什么方法可以创建线程以一次运行多个方法吗? 这样,如果任何方法在所有其他线程之间失败,则应终止。 问题答案: 每个node.js进程在设计上都是单线程的。因此,要获得多个线程,您必须具有多个进程(正如其他一些发帖人所指出的那样,您还可以链接到一些库,这些库使您能够使用Node中的线程,但是没有这些库就没有这种能力。请参阅Shawn Vincent的回答,参考https://githu

  • 我正在考虑从主线程创建、的可能性,而分离的线程创建线程并等待之后再运行下一个线程。 但我不认为这是可能的,因为我总是在第一个线程之后而在下一个线程之前崩溃。 : : 因此,以下是我希望发生的事情: 更新:如何接受这个并将其分解,以便在标头中声明,但在需要的地方执行,然后执行

  • 我正在解决一个生产者/消费者问题,我想创建几个生产者和消费者(几个线程),我有一个问题,我如何才能正确地创建几个线程,使一个任务不由两个线程执行(每个线程执行一个不同的任务)。 代码:我试着做一个循环,就像下面这样: 输出:但它不起作用,因为线程相互重叠

  • 我在很多地方读过,线程池减少了线程创建开销,从而提高了性能。但是一旦线程执行完它的run方法,它就会进入dead/terminated状态,这意味着它可以再次重新启动。 那么,线程池如何处理线程的释放呢?它是否真的以某种方式保存线程以服务下一个任务,或者在每次提交任务时在内部创建新线程?