c - 自旋锁锁定系统

标签 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);       
}

最佳答案

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

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

相关文章:

c - 使用iceast服务器开发网络广播监听客户端

c - TI TM4C - 为什么设置 GPIOCR 会直接进入 BusFault?

python - 如何在没有线程或任务队列的情况下在 Flask 中运行后台作业

multithreading - 在调试环境之外识别 Delphi 应用程序中的线程

java - 服务器意外停止读取客户端消息

c - 排序插入链表

c - 从内联汇编中的命令行获取参数

multithreading - 停留在伪代码中的并发编程示例(原子操作/细粒度原子性)

C#锁定SQL Server表的方法

mysql - 悲观锁如何在数据库中工作,隔离级别是否与它有任何关系?