【问题标题】:Mutual exclusion within a function Contiki函数内的互斥 Contiki
【发布时间】:2019-09-25 03:39:08
【问题描述】:

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

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

例如,

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),因为它必须出现在进程/原型线程块中。这是因为虽然我可以在实际的进程块中创建一个锁(见下文),但这会导致进程阻塞的时间比必要的长得多

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

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

【问题讨论】:

  • “添加/删除不会发生在进程/原型线程块中” 在您的示例中不正确 func1() 在进程块中被调用,因此@987654325 也是如此@,以及在这些函数中调用的任何内容。在调用PROCESS_END() 之前,不会退出进程块。
  • @Clifford 他的问题是来自pt-sem.h 的信号量代码仅在从PROCESS_THREAD 块调用时才有效,而不是在从这些块调用的函数内部。
  • @kfx :正如您在回答中所说,如果仅在协作线程中访问,则不需要互斥锁。我对 Contiki 特别不熟悉,所以我向您的高超知识低头。对我来说似乎是一个奇怪的设计。

标签: c mutex atomic contiki contiki-process


【解决方案1】:

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

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

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

2) 如果您的列表只能从 protothreads 访问,则不需要任何锁定。这是推荐的设计。

确实,使用原型线程的主要优势是在 99% 的情况下不需要锁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 2013-07-07
    • 2011-06-13
    • 2016-04-27
    • 2016-04-21
    • 2011-01-06
    • 1970-01-01
    相关资源
    最近更新 更多