• windows 和linux 同步api对比


     

    初始化临界区

    (win)

    InitializeCriticalSection(RTL_CRITICAL_SECTION &rtl_critial_section)      

     (linux)

     pthread_mutexattr_init(&(mutex)->attr);

    pthread_mutexattr_settype(&(mutex)->attr, PTHREAD_MUTEX_RECURSIVE);

     pthread_mutex_init(&(mutex)->mtx, &(mutex)->attr);

    删除临界区

    (win)

    DeleteCriticalSection(RTL_CRITICAL_SECTION &)           

    (linux)      

     pthread_mutex_destroy(pthread_mutex_t  &mutex)

    进入临界区

    (win)

    EnterCriticalSection(RTL_CRITICAL_SECTION &rtl_critical_section) 

    (linux)

    pthread_mutex_lock(pthread_mutex_t  &mutex)

    尝试进入临界区

    (win)

    TryEnterCriticalSection(RTL_CRITICAL_SECTION &rtl_critical_section )

    (linux)

      pthread_mutex_trylock(pthread_mutex_t  &mutex)

    离开临界区

    (win)

    LeaveCriticalSection(RTL_CRITICAL_SECTION &rtl_critical_section ) 

    (linux)

    pthread_mutex_unlock(pthread_mutex_t  &mutex)

    把目标操作数(第1参数所指向的内存中的数)与一个值(第3参数)比较,如果相等,则用另一个值(第2参数)与目标操作数(第1参数所指向的内存中的数)交换;InterlockedExchange是不比较直接交换。整个操作过程是锁定内存的,其它处理器不会同时访问内存,从而实现多处理器环境下的线程互斥

    (win)

    InterlockedCompareExchange(Destination, newvalue, oper) 

    (linux)

    __sync_val_compare_and_swap(Destination, oper, newvalue)

    v的值原子添加P的大小

    (win)

    InterlockedExchangeAdd(V, P) 

    (linux)

    __sync_fetch_and_add(V, P)

    原子增加一

    (win)

    InterlockedIncrement(T)  

    (linux)

    __sync_fetch_and_add(T, 1)

    原子减少一

    (win)

    InterlockedDecrement(T) 

    (linux)

    __sync_fetch_and_sub(T, 1)

    获取当前线程id

    (win)

     GetCurrentThreadId()

    (linux)

      syscall(SYS_gettid)

    如果指定一个非零值,函数处于等待状态直到hHandle 标记的对象被触发,或者时间到了。如果dwMilliseconds 为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds 为INFINITE,对象被触发信号后,函数才会返回。对应的linux实现使用条件变量

    (win)

    WaitForSingleObject(event,INFINITE) 

    (linux)

    pthread_mutex_lock( &m_tx );
    pthread_cond_wait( &event, &m_tx );
    pthread_mutex_unlock( &m_tx );

    退出线程(退出参数0)

    (win)

    ExitThread(0)

    (linux)

      pthread_exit(0)

    设置线程优先级,pthread_setschedparam在多线程开发中经常被使用的,它主要用于设置线程的调用策略和优先级

    (win)

    SetThreadPriority (handle,nPrioroty)

    (linux)

    sched_param sp = {nPriority};
    if(0 == pthread_setschedparam(m_pid, SCHED_RR, &sp))
    {
    return true;
    }
    return false;

    获取优先级

    (win)

    GetThreadPriority( Handle m_hThread ) 

    (linux)

    int policy;
    sched_param sp;
    pthread_getschedparam(m_pid, &policy, &sp))
    sp.sched_priority;

    初始化互斥量

    (linux)

    pthread_mutex_init(pthread_mutex_t  &mutex),0)

    初始化条件变量

    pthread_cond_init(&cond,0)

    删除互斥量

    pthread_mutex_destroy(pthread_mutex_t  &mutex))

    删除条件变量

    (linux)

    pthread_cond_destroy(pthread_cond_t &cond)

    向条件变量发起信号

    (linux)

    pthread_cond_signal(pthread_cond_t &cond)

    挂起等待结束(无限等待)    true在阻塞期间允许进入警告状态(windows才有)

    (win)

    WaitForSingleObject Ex(handle, INFINITE,true)                      

    (linux)          

    pthread_join    (pthread_t thid, void ** ret_val)   常用pthread_join(pid,0)

  • 相关阅读:
    语音激活检测(VAD)--前向神经网络方法(Alex)
    语音信号处理基础
    MySQL死锁系列-插入语句正常,但是没有插入成功
    关于wx.getProfile和wx.login获取解密数据偶发失败的原因
    指针访问数组元素
    libev 源码解析
    leveldb 源码--总体架构分析
    raft--分布式一致性协议
    使用springcloud gateway搭建网关(分流,限流,熔断)
    爬虫
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4452256.html
Copyright © 2020-2023  润新知