gpt4 book ai didi

c - 函数内的互斥 Contiki

转载 作者:行者123 更新时间:2023-11-30 16:31:27 26 4
gpt4 key购买 nike

因为 Contiki 提供的内置列表不符合我的需求(使用太多内存),我实现了自己的列表版本,该版本已针对我打算如何使用它进行了优化。

在任何时候,这些列表中都会有一个由多个进程/原线程对其进行操作(即添加/删除元素)。但是,添加/删除不会发生在进程/原型(prototype)线程 block 内,而是在一个函数内调用,该函数是通过进程/原型(prototype)线程发起的一系列函数调用来调用的。

例如,

void funct2()
{
// add or remove element from shared list
}

void func1()
{
// some stuff
func2();
// more stuff
}

PROCESS_THREAD(temp1, ev, data)
{
PROCESS_BEGIN();
func1();
PROCESS_END();
}

PROCESS_THREAD(temp2, ev, data)
{
PROCESS_BEGIN();
func1();
PROCESS_END();
}

因此,我无法使用 Contiki 的内置机制来创建互斥体(通过使用 pt-sem.h),因为它必须出现在进程/原型(prototype)线程 block 中。这是因为虽然我可以在实际进程 block 中创建锁(见下文),但这将导致阻塞进程的时间远远超过所需的时间

PROCESS_THREAD(temp2, ev, data)
{
PROCESS_BEGIN();
// get lock
func1();
// release lock
PROCESS_END();
}

这是一个非常有问题的问题,因为从列表中添加和删除元素不是原子的;如果在删除或添加元素到列表时发生中断,事情将无法正常运行。是否可以轻松地做我想做的事?即在函数调用中原子地添加和删除列表中的元素,而不是在进程/原型(prototype)线程 block 中?

最佳答案

您似乎对原型(prototype)线程的作用感到困惑。原始线程方法是一种协作调度形式。当执行流要求让出时,原型(prototype)线程只能在特定点让出。中断永远不能将执行流程切换到另一个原型(prototype)线程。

因此,有两个不同的选择:

1) 如果您的列表同时从原线程和中断处理程序上下文访问,您需要在禁用中断的情况下对列表进行所有修改。因此,您的锁定/解锁代码分别是禁用/启用中断。

2) 如果您的列表仅从原始线程访问,则不需要任何锁定。这是推荐的设计。

事实上,使用原型(prototype)线程的主要优点是在 99% 的情况下不需要锁。

关于c - 函数内的互斥 Contiki,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50559566/

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