gpt4 book ai didi

c - C 中的同步对象及其与数据结构结构的关联

转载 作者:行者123 更新时间:2023-11-30 15:06:40 24 4
gpt4 key购买 nike

我用C编写了一些数据结构,例如线程池使用的任务队列。它与互斥锁和条件变量对象同步。我这样做是这样的:

struct task_queue { 
// some fields
};

typedef struct task_queue task_queue_t;

static pthread_mutex_t mutex;
static pthread_cond_t cond;

task_queue_init(task_queue_t **tq);
task_queue_destroy(task_queue_t *tq);

但现在我认为这种方法是相当错误的,因为当我在程序中使用 task_queue_init() 创建多个 task_queue 结构实例时,它们将由相同的 pthread_mutex_t、pthread_cond_t 对象同步。我想我之前在某处见过这样的静态同步对象声明,并且我在我的代码中使用了它。

我的问题是确保自己计划以正确的方式进行操作,即始终将此同步对象放入此结构 task_queue 或其他同步数据结构结构中,如下所示:

struct task_queue { 
// hitherto fields
pthread_mutex_t mutex;
pthread_cond_t cond;
}
typedef struct task_queue task_queue_t;

//and initialize/destroy them in
task_queue_init(task_queue_t **tq);
task_queue_destroy(task_queue_t *tq);

也许我应该在这个结构中使用指向 mutex, cond 的指针?

最佳答案

(首先我应该提到我来自 OpenMP 和 WinAPI,而不是 POSIX。)

最佳解决方案取决于任务的结构、信息传递和运行时行为。

如果我对问题的理解是正确的,那么它的目的是在运行时分配任务队列及其必要的基础设施。在这种情况下,将基础设施放置在结构中并不是不正确的。据我所知,在大多数情况下,运行时的分配是作为堆分配完成的,这又意味着从进程的所有任务到进程的堆内存中的相同位置的读/写访问。根据访问频率,这可能会也可能不会导致性能问题(“错误共享”,根据经验,尽量避免进程全局数据)。

如果(!)另一方面......

a) 将存在多个(主)任务,每个任务都使用自己的任务队列及其必要的基础设施

b.1) 排队(工作)任务不需要访问其任务队列的基础结构

b.2) 或有关任务队列基础结构的信息在排队(工作)任务和它正在使用的(主)任务(任务/线程专用副本进出)之间传递

...通过在使用(主)任务的堆栈内存上分配,可以避免一些内存访问问题。在这种情况下,我将使用具有预定义的足够大小的数组。正如您所建议的,这可能是单个一维结构数组。还可以使用各种一维数组,每个数组具有相同数量的元素。每个数组都保存一种类型信息的元素:一个数组用于任务队列,一个数组用于任务队列的互斥体,等等。然后通过访问具有相同数组索引的各个数组来访问相同的任务队列及其基础设施。根据具体情况,这对于将有关任务队列的信息传入和传出排队(工作)任务来说可能是有利的。

关于c - C 中的同步对象及其与数据结构结构的关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38867429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com