栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SylixOS中的线程【13】--- 线程安全模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SylixOS中的线程【13】--- 线程安全模式

概念

为防止某些关键过程操作线程被删除或重启,SylixOS提供线程安全模式相关接口。线程进入安全模式后, 任何对本线程的删除或重启操作都会推迟到线程退出安全模式时进行。

接口
ULONG  API_ThreadSafe (VOID)
ULONG  API_ThreadUnsafe (VOID)
BOOL    API_ThreadIsSafe (LW_OBJECT_HANDLE    ulId)
示例
ssize_t  _TyWrite (TY_DEV_ID  ptyDev, 
                   PCHAR      pcBuffer, 
                   size_t     stNBytes)
{
             INTREG     iregInterLevel;
             
    REGISTER INT        iBytesput;
    REGISTER ssize_t    sstNbStart = stNBytes;
    
    REGISTER ULONG      ulError;
    
    if (pcBuffer == LW_NULL) {
        _ErrorHandle(EINVAL);
        return  (PX_ERROR);
    }
    
    if (stNBytes == 0) {
        return  (0);
    }
    
    LW_THREAD_SAFE();                                                   
    
    while (stNBytes > 0) {
        ulError = API_SemaphoreBPend(ptyDev->TYDEV_hWrtSyncSemB, ptyDev->TYDEV_ulWTimeout);
        if (ulError) {
            LW_THREAD_UNSAFE();
            _ErrorHandle(ERROR_IO_DEVICE_TIMEOUT);                      
            return  (sstNbStart - stNBytes);
        }
        
        TYDEV_LOCK(ptyDev, LW_THREAD_UNSAFE(); return (PX_ERROR));      
        
        if (ptyDev->TYDEV_iAbortFlag & OPT_WABORT) {                    
            ptyDev->TYDEV_iAbortFlag &= ~OPT_WABORT;                    
            TYDEV_UNLOCK(ptyDev);                                       
            LW_THREAD_UNSAFE();
            _ErrorHandle(ERROR_IO_ABORT);                               
            return  (sstNbStart - stNBytes);
        }
        
        if (ptyDev->TYDEV_tydevwrstat.TYDEVWRSTAT_bCanceled) {          
            ptyDev->TYDEV_tydevwrstat.TYDEVWRSTAT_bCanceled = LW_FALSE; 
            TYDEV_UNLOCK(ptyDev);                                       
            LW_THREAD_UNSAFE();
            _ErrorHandle(ERROR_IO_CANCELLED);
            return  (sstNbStart - stNBytes);
        }
        
        LW_SPIN_LOCK_QUICK(&ptyDev->TYDEV_slLock, &iregInterLevel);     
        iBytesput = rngBufPut(ptyDev->TYDEV_vxringidWrBuf, 
                              pcBuffer, 
                              (INT)stNBytes);                           
        LW_SPIN_UNLOCK_QUICK(&ptyDev->TYDEV_slLock, iregInterLevel);    
        
        _TyTxStartup(ptyDev);                                           
        
        stNBytes -= (size_t)iBytesput;                                  
        pcBuffer += iBytesput;                                          
    
        LW_SPIN_LOCK_QUICK(&ptyDev->TYDEV_slLock, &iregInterLevel);     
        if (rngFreeBytes(ptyDev->TYDEV_vxringidWrBuf) > 0) {
            LW_SPIN_UNLOCK_QUICK(&ptyDev->TYDEV_slLock, iregInterLevel);
            API_SemaphoreBPost(ptyDev->TYDEV_hWrtSyncSemB);             
        
        } else {
            LW_SPIN_UNLOCK_QUICK(&ptyDev->TYDEV_slLock, iregInterLevel);
        }
        
        TYDEV_UNLOCK(ptyDev);                                           
    }
    
    LW_THREAD_UNSAFE();                                                 
    
    return  (sstNbStart);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/692334.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号