【问题标题】:How to pass many queue id to a thread如何将多个队列ID传递给线程
【发布时间】:2021-07-08 18:44:33
【问题描述】:

我在 C 语言中的这个程序有问题。简而言之,我必须通过聚合器发送传感器创建的数据。聚合器通过写入器线程,通过三个读取器线程(thread_lettore)将传感器生成的值读取到三个不同的队列中,只有当我创建线程时,所有三个都连接到创建的最后一个队列。我希望每个线程都有自己的队列。传递传感器的消息队列 id 很容易,因为只有一个消息队列,但是如何将不同的消息队列 id 传递给每个线程?

我在这个for 循环中发现了错误,但我无法解决它。它生成正确的队列,但是当我将参数传递给pthread_create 时,它只传递了最后一个创建的队列。

 MonitorLS * m = (MonitorLS*) malloc(sizeof(MonitorLS));

    for (int i=0; i<3; i++){
            m->id_coda_c = id_code_collettori[i];
            pthread_create(&threads[i], &attr, thread_lettore, (void*)m);
        }

这是头文件中的结构:

typedef struct {

    int variabile;

    pthread_mutex_t mutex;
    pthread_cond_t cv_lett;
    pthread_cond_t cv_scritt;

    int num_scrittori;
    int num_lettori;
    int id_coda_s;
    int id_coda_c;

} MonitorLS;

这就是我在主文件中创建三个不同消息队列的方式:

char chiave = 'a';
int id_code_collettori[3];
for (int i=0; i<3; i++){
   key_t key_c = ftok (".", chiave);
   id_code_collettori[i] = msgget(key_c, IPC_CREAT|0644);
   chiave = chiave + 1;
}

这是我的大学教授布置给我的家庭作业。对不起我的英语不好。

【问题讨论】:

  • 您正在向每个线程发送相同的指针。该指针是一些内存的地址。在该内存中,您正在写入所有队列 ID。当你在内存中写入数据时,它会替换之前相同地址的数据。
  • 我知道,我在谷歌上搜索了各种解决方案,但我无法解决这个问题
  • 你明白问题所在了吗?
  • @user253751 是的,但我尝试了很多方法来解决,但我无法解决
  • 你能用你自己的话解释一下导致问题的原因吗?

标签: c multithreading pthreads


【解决方案1】:

问题是你只分配了一个 MonitorLS 结构。 您将第一个队列 ID 放入结构中。你开始第一个线程。您将第二个队列 ID 放入结构中。你开始第二个线程。您将第三个队列 ID 放入结构中。你启动第三个线程。

... 几微秒后,第一个线程启动并查看结构并获取队列 ID(这是第三个,因为这是你放在那里的)。
... 几微秒后,第二个线程启动并查看结构并获取队列 ID(这是第三个,因为这是你放在那里的)。
... 几微秒后,第三个线程启动并查看结构并获取队列 ID(这是 第三个,因为这是你放在那里的)。

因此,您需要使用三个不同的变量来存储三个不同的队列 ID,而不是使用一个变量三次。您可以分配三个不同的 MonitorLS 结构,每个线程一个。事实上,这基本上是你唯一的选择。不过,我看到 MonitorLS 中还有其他东西,所以您可能想要制作 another 结构(我们称之为 ThreadInfo),它有一个指向您的 MonitorLS 结构的指针(每个 ThreadInfo 中的指针相同)和一个队列 ID(在每个 ThreadInfo 中都不同)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多