gpt4 book ai didi

c - 自旋锁锁定系统

转载 作者:太空宇宙 更新时间:2023-11-04 06:38:29 27 4
gpt4 key购买 nike

我正在尝试在 vxWorks 6.7 中使用 spinlockIsr_t,但如果我尝试将它用于多个任务,系统会卡住。您是否允许使用多个任务来尝试获取相同的自旋锁?如果不是,那么它首先有什么意义呢?以下代码适用于 1 或 2 个任务,但是一旦任务数量增加到 3 个,系统就会卡住,然后才能在控制台上完成打印第一行。

spinlockIsr_t mySpinLock; 
int sharedResource;
void vx_test_mtx_spin_lock(void)
{
const int kNumTask = 3;
const int kTaskPriority = 50;
const int kTaskStackSize = 10000;
int i = 0;
sharedResource = 0;
char procName[40];
printf("Number of tasks : %d\n", kNumTask);
printf("SPIN_LOCK_ISR_INIT() [main task]\n");
SPIN_LOCK_ISR_INIT (&mySpinLock, 0); printf("SPIN_LOCK_ISR_TAKE() [main task] \n");
SPIN_LOCK_ISR_TAKE (&mySpinLock);
for (i = 0; i < kNumTask; i++){
sprintf(procName, "%s%d", "myTask", i); printf("taskSpawn() [main task]\n");
taskSpawn((char*)procName,
kTaskPriority,
0,
kTaskStackSize,
(FUNCPTR)vx_spin_lock_unlock,
0,0,0,0,0,0,0,0,0,0
);
} printf("SPIN_LOCK_ISR_GIVE() [main task]");
SPIN_LOCK_ISR_GIVE (&mySpinLock);

}

void vx_spin_lock_unlock(void)
{
printf("SPIN_LOCK_ISR_TAKE() [spawned task] \n");
SPIN_LOCK_ISR_TAKE (&mySpinLock);
/* ... Access the share resource here */ printf("SPIN_LOCK_ISR_GIVE() [spawned task] \n");
SPIN_LOCK_ISR_GIVE (&mySpinLock);
}

最佳答案

我怀疑您有一个优先级较高的任务在自旋锁上旋转,而一个优先级较低的任务已经持有该锁。较低优先级的任务将永远无法运行,因此锁永远不会解锁,并发生死锁。自旋锁基本上不应该在实时系统中使用。如果使用它们,您必须确保可以在锁上自旋的所有线程都具有相同的优先级。

关于c - 自旋锁锁定系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11963103/

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