Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.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
Linux 如何在运行时将新消息传递给线程函数?_Linux_Multithreading_Pthreads - Fatal编程技术网

Linux 如何在运行时将新消息传递给线程函数?

Linux 如何在运行时将新消息传递给线程函数?,linux,multithreading,pthreads,Linux,Multithreading,Pthreads,在pthread\u create中,我可以指定一条消息,然后在运行时,我可能会得到需要传递到线程进行打印的新消息 一种方法可能是创建一个全局向量,并继续向其中添加消息。线程将获取该向量并扫描它以查找新消息。 但是这样就必须为n个线程创建n个向量 或一个具有线程ID、消息和打印状态的结构 可行的解决办法是什么 编辑1: 以下设计是否良好或需要一些改进 以下代码将在一个普通函数中编写,该函数将由main()调用 检查线程(负责抓取该消息)是否已经存在 如果是,将消息推送到该线程的队列中,使用(

pthread\u create
中,我可以指定一条消息,然后在运行时,我可能会得到需要传递到线程进行打印的新消息

一种方法可能是创建一个全局向量,并继续向其中添加消息。线程将获取该向量并扫描它以查找新消息。
但是这样就必须为n个线程创建n个向量
或一个具有线程ID、消息和打印状态的结构

可行的解决办法是什么

编辑1: 以下设计是否良好或需要一些改进

以下代码将在一个普通函数中编写,该函数将由main()调用

  • 检查线程(负责抓取该消息)是否已经存在

    • 如果是,将消息推送到该线程的队列中,使用(pthread\u cond\u signal())唤醒该线程
    • 如果否,则创建线程,创建其队列,将消息推送到该队列中
  • 当线程读取完其队列中的所有消息后,让它与(pthread_cond_wait())一起休眠


如果你有一个全局队列,我会使用链表,而不是向量,并用互斥锁将其锁定,否则你会得到竞争条件。

如果你有一个全局队列,我会使用链表,而不是向量,并用互斥锁将其锁定,否则你会得到竞争条件。

谷歌“pthreads producer consumer queue”。您不需要扫描新条目-生产者向消费者线程发出信号,表示新条目可用。

谷歌“pthreads生产者消费者队列”。您不需要扫描新条目-生产者向使用者线程发出新条目可用的信号。

将全局向量作为pthread特定的数据,因此每个线程都有自己的数据副本。您不需要创建N个变量

将全局向量作为pthread特定的数据,这样每个线程都有自己的数据副本。您不需要创建N个变量

是的,锁是必要的。谢谢为什么链接列表不是向量?链接列表添加/删除元素的速度要快得多,因为随着列表的增长/收缩,不需要realloc/memmove,您只需更新指针即可。@Geofferey好的,谢谢。这将是一个新问题另外,为什么要在全局队列上使用互斥锁?线程将读取队列中的id并相应地执行操作,它们不会删除随机消息!我错了吗?如果一个线程正在从队列中删除一个项目,而另一个线程正在添加一个项目,那么列表的内部将变得混乱,例如第一个/最后一个元素和列表大小。另外,如果您不想自己实现队列的所有symantecs,请将beanstalkd视为一个外部队列。@Anisha:有两个原因-1)线程不必搜索其工作项,2)队列上的争用可能会减少:如果工作项放在线程a的队列上,如果某个项目的队列中的互斥锁不被保持,线程B就不需要阻塞来将其拉出。是的,锁定是必要的。谢谢为什么链接列表不是向量?链接列表添加/删除元素的速度要快得多,因为随着列表的增长/收缩,不需要realloc/memmove,您只需更新指针即可。@Geofferey好的,谢谢。这将是一个新问题另外,为什么要在全局队列上使用互斥锁?线程将读取队列中的id并相应地执行操作,它们不会删除随机消息!我错了吗?如果一个线程正在从队列中删除一个项目,而另一个线程正在添加一个项目,那么列表的内部将变得混乱,例如第一个/最后一个元素和列表大小。另外,如果您不想自己实现队列的所有symantecs,请将beanstalkd视为一个外部队列。@Anisha:有两个原因-1)线程不必搜索其工作项,2)队列上的争用可能会减少:如果工作项放在线程a的队列上,如果某个项目的队列中的互斥锁不被保持,线程B就不必阻塞以将其拉出。