spinLock锁定系统

时间:2012-08-15 01:47:45

标签: c multithreading locking vxworks

我正在尝试在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);       
}

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

这实际上是对spinLocks的错误应用。 在大多数情况下,您应该只使用互斥信号量而不是spinLock。

SpinLocks旨在拥有非常短的关键部分。 执行字符串和I / O(即printf)操作短。 与执行taskSpawn相同。

事实上,在进行旋转锁定时进行任何系统调用都是一个巨大的危险信号。

答案 2 :(得分:0)

您在该系统中拥有多少个核心?有没有什么可以抢占纺纱任务? 因为所有的任务都会锁定,所以你固定了所有核心 - 游戏结束了。