• linux多线程编程之线程安全 mutex锁的使用


    由于之前写的本来说多进程,但是由于需要共享资源(也就是共享一些变量),虽然进程通过其他方法可以实现共享资源,但是还是觉得用线程比较好!

    所以改成多线程了,但是一直没有用mutex,出现了不少段错误。我觉得势必和资源共享有许多关系!

    本来线程安全 的 资源共享 我觉得 用个变量来控制就行,比如

    int lock_x=0;

    在线程中

    if(lock_x==1) usleep(20);//休息20毫秒 、、这里我还害怕死循环呢

    lock_x=1;

    //do change of x

    lock_x=0;

    这样看起来好,实际上也不咋样吧。pthread_mutex(看参考资料1)我早就知道,但是不知具体用法,其实用法比上面的要简单,而且可以少写一句话,而且肯定比我的线程数据安全了。

    我就写个例子吧。多线程的 共享资源修改示例:

    /*
    ============================================================================
    Name : mutex_test.c
    Author : ayanmw
    Version :
    Copyright : CopyRight ptopn.com
    Description : Hello World in C, Ansi-style
    ============================================================================
    */

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    #include <pthread.h>
    int x=0;
    pthread_mutex_t mutex_x= PTHREAD_MUTEX_INITIALIZER;
    void *client(int *data){
    pthread_mutex_lock(&mutex_x);
    fprintf(stdout,"%d:mutex_lock\n",data);
    x++;
    fprintf(stdout,"%d:mutex 正在修改x的值:%d\n",data,x);
    sleep(1);
    pthread_mutex_unlock(&mutex_x);
    fprintf(stdout,"%d:mutex_unlock\n",data);

    }
    int main(void) {
    int i=1;
    pthread_t threadInfo;
    pthread_attr_t threadInfo_attr;

    pthread_create(&threadInfo,NULL,client,(void *)1);
    pthread_create(&threadInfo,NULL,client,(void *)2);
    pthread_create(&threadInfo,NULL,client,(void *)3);

    pthread_join(threadInfo,NULL);
    //fprintf(stdout,"Hi");
    return EXIT_SUCCESS;
    }

    运行结果如下:

    2:mutex_lock
    2:mutex 正在修改x的值:1//此处停留1s
    2:mutex_unlock
    3:mutex_lock
    3:mutex 正在修改x的值:2//此处停留1s
    3:mutex_unlock
    1:mutex_lock
    1:mutex 正在修改x的值:3//此处停留1s

    前面的数字 因为情况不同,也会顺序有变化的,如果把mutex_lock And Unlock 去掉,运行结果是这样子的:

    2:mutex_lock
    2:mutex 正在修改x的值:1
    1:mutex_lock
    3:mutex_lock
    3:mutex 正在修改x的值:2
    1:mutex 正在修改x的值:3
    2:mutex_unlock
    3:mutex_unlock
    1:mutex_unlock

    注意:我的程序编译会报警告,因为我把int直接 当 指针传递,使用不能用 *data的。因为灵活变通嘛,我才这样写。实际还要要规范下代码的!

    上面的示例程序,实际情况是一个socket服务器,没接收到一个客户端连接,就建立一个线程,进行连接。本身继续监听。客户端 单线程。


    参考资料:Linux多线程编程的高效开发经验:http://www.ibm.com/developerworks/cn/linux/l-cn-mthreadps/

    ubuntu man手册

    ubuntu自带的man不全,需要安装

               manpages
               manpages-zh  //这个我认为没必要进行设置,安装即可用。但是这个是一些常用的中文man,而不是全部。man bind 会显示中文,看起来舒服多了。如果man中文计划全部翻译就好了。
               manpages-dev
               libstdc++6-4.4-doc
               manpages-posix
               manpages-posix-dev

    这个可以根据apt-get install manpages- 按tab会显示可安装的软件包(ubuntu的这个设置太方便了,好用)。

    通过man -k thread/man -k pthread /man -k pthread_mutex /man -k pthread_cond

    来查询相关的man手册 然后man 3posix thread_create来查看对应的手册。

      

    转载请注明出处:http://www.cnblogs.com/ayanmw 多谢

    ------------------------------------------------------------------------------------------------

    一定要专业!本博客定位于 ,C语言,C++语言,Java语言,Android开发和少量的Web开发,之前是做Web开发的,其实就是ASP维护,发现EasyASP这个好框架,对前端后端数据库 都很感觉亲切啊。. linux,总之后台开发多一点。以后也愿意学习 cocos2d-x 游戏客户端的开发。

  • 相关阅读:
    WebService帮助类改良版,支持多webservice
    .NET-list扩展方法Distinct去重
    C#创建泛型类T的实例的三种方法
    划水网站
    DataGridView增加右键取消操作
    Sql Server 快捷键
    SQL Server中使用convert进行日期转换
    ToolStrip 选中某一项打勾
    H5实现手写功能
    git使用
  • 原文地址:https://www.cnblogs.com/ayanmw/p/2380455.html
Copyright © 2020-2023  润新知