【发布时间】: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