首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spinLock锁定系统

spinLock锁定系统
EN

Stack Overflow用户
提问于 2012-08-15 09:47:45
回答 3查看 1.3K关注 0票数 0

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

代码语言:javascript
复制
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);       
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-15 10:32:41

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

票数 4
EN

Stack Overflow用户

发布于 2012-08-15 22:44:02

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

SpinLocks的设计意图是有一个非常短的关键部分。执行字符串和I/O (例如,打印)操作是短的,而不是短的()。和做taskSpawn一样。

事实上,在持有自旋锁的同时执行任何系统调用都是一个巨大的危险信号。

票数 1
EN

Stack Overflow用户

发布于 2012-08-15 10:37:15

因为你所有的任务都在一个锁上旋转,一旦你锁定了所有的核心,游戏就结束了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11963103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档