码迷,mamicode.com
首页 > 其他好文 > 详细

SylixOS POSIX trywrlock

时间:2018-01-21 13:40:35      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:pos   返回   信息   har   des   aac   技术   int   技术分享   

  • SylixOS trywrlock与Linux差异
    在移植Linux的中间件时需要使用中间件自带的测试程序进行测试,在测试线程尝试获取写锁时会遇到理论上应该有错误信息的,而在SylixOS上没有错误提示从而导致测试程序失败。测试模型如程序清单 1.1所示。
    程序清单 1.1 线程读写锁测试模型
    #include <stdio.h>
    #include <pthread.h>
    pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER;
  • int main(int argc, char const *argv[])
    {
    int iRet = -1;

    iRet = pthread_rwlock_init(&rwlock, NULL);
    if (iRet != 0) {
        printf("pthread_rwlock_init failed.\n");
        return (-1);
    }
    iRet = pthread_rwlock_trywrlock(&rwlock);
    if (iRet != 0) {
        printf("first trywrlock return %d\n", iRet);
        return (-1);
    }
    /*
     * do something
     */
    iRet = pthread_rwlock_trywrlock(&rwlock);
    if (iRet != 0) {
        printf("second trywrlock return %d\n", iRet);
        return (-1);
    }
    /*
     * do something
     */
    pthread_rwlock_destroy(&rwlock);
    printf("posix rwlock success!\n");
    return (0);

    }
    Linux上测试结果如图 1.1所示,Linux下在第二次trywrlock时失败(测试时有时候就需要测试错误信息)。
    技术分享图片
    图 1.1 Linux读写锁测试结果
    在SylixOS上测试结果如图 1.2所示,程序正常运行。
    技术分享图片
    图 1.2 SylixOS读写锁测试结果
    因为测试程序就是针对错误信息进行测试的,所以在SylixOS下该测试用例不通过。

    1. 原理分析
      根据SylixOS和Linux下的不同测试结果分析可知两者区别便是:同一个线程在第一次获得读写锁后再一次trywrlock时是否返回成功。
      2.1 SylixOS读写锁实现
      SylixOS线程在第二次trywrlock时做了一个判断,如果该写锁被当前线程使用,则引用计数值加一且返回成功,源码如图 1.1所示。
      技术分享图片
      图 2.1 SylixOS写锁判断
      SylixOS认为某个线程之前已经获得写锁,现在该线程需要再次trywrlock则认为获取写锁成功(因为该线程一直拥有写锁)。
      2.2 Linux读写锁实现
      Linux线程在第二次trywrlock时,发现写锁被使用则直接返回EBUSY(EBUSY=16)即表示出错,源码如图 2.2所示。
      技术分享图片
      图 2.2 Linux写锁实现原理
      对于Linux trywrlock而言,只关心能否获得锁。能够获取成功则返回0,发现写锁被使用则返回出错。
    2. 总结
      SylixOS的trywrlock关注的是当前线程能否进行写操作,而Linux的trywrlock则关注能否获取写锁(如果写锁被占用则返回出错)。

    SylixOS POSIX trywrlock

    标签:pos   返回   信息   har   des   aac   技术   int   技术分享   

    原文地址:http://blog.51cto.com/12558035/2063335

    (0)
    (0)
       
    举报
    评论 一句话评论(0
    登录后才能评论!
    © 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
    迷上了代码!