• 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)

  • 相关阅读:
    DL/T 467-2019 电站磨煤机及制粉系统性能试验
    fidlder-05(拦截并修改数据)
    fiddler-04(怎么对APP抓包)
    Redis5设计与源码分析读后感(二)简单动态字符串SDS
    Jedis连接搭建在阿里云服务器上的Redis,基于Linux(CentOS7)
    centos7下安装redis6.0版本+3种启动方式
    Linux下端口被占用的解决方法
    Linux卸载Nginx
    linux中普通用户修改密码出现(passwd:Authentication token manipulation error)
    linux重置密码提示与用户名相似该怎么解决?
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4452256.html
Copyright © 2020-2023  润新知