3、Linux多线程,线程同步

5)线程私有数据

进程内的所有线程共享进程的数据空间,因此全局变量为所有线程所共有。但有时线程也需要保存自己的私有数据,这时可以创建线程私有数据(Thread-specific Date)TSD来解决。在线程内部,私有数据可以被各个函数访问,但对其他线程是屏蔽的。例如我们常见的变量errno,它返回标准的出错信息。它显然不能是一个局部变量,几乎每个函数都应该可以调用它;但它又不能是一个全局变量,否则在A线程里输出的很可能是B线程的出错信息。要实现诸如此类的变量,我们就必须使用线程数据。我们为每个线程数据创建一个键,它和这个键相关联,在各个线程里,都使用这个键来指代线程数据,但在不同的线程里,这个键代表的数据是不同的,在同一个线程里,它代表同样的数据内容。

线程私有数据采用了一键多值的技术,即一个键对应多个数值,访问数据时好像是对同一个变量进行访问,但其实是在访问不同的数据。

创建私有数据的函数有4个:pthread_key_create(创建), pthread_setspecific(设置), pthread_getspecific(获取), pthread_key_delete(删除)。

#include <pthread.h>

int pthread_key_creadte(pthread_key_t *key,void (*destr_fuction) (void *));

int pthread_setspecific(pthread_key_t key,const void * pointer));

void * pthread_getspecific(pthread_key_t key);

int pthread_key_delete(ptherad_key_t key);

6)线程同步

线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点。linux下提供了多种方式来处理线程同步,最常用的是互斥锁、条件变量和异步信号。

1)互斥锁(mutex)

通过锁机制实现线程间的同步。同一时刻只允许一个线程执行一个关键部分的代码。

int pthread_mutex_init(pthread_mutex_t *mutex,const pthread_mutex_attr_t *mutexattr);

int pthread_mutex_lock(pthread_mutex *mutex);

int pthread_mutex_destroy(pthread_mutex *mutex);

int pthread_mutex_unlock(pthread_mutex *

(1)先初始化锁init()或静态赋值pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIER

attr_t有:

PTHREAD_MUTEX_TIMED_NP:其余线程等待队列

PTHREAD_MUTEX_RECURSIVE_NP:嵌套锁,允许线程多次加锁,不同线程,解锁后重新竞争

PTHREAD_MUTEX_ERRORCHECK_NP:检错,与一同,线程请求已用锁,返回EDEADLK;

PTHREAD_MUTEX_ADAPTIVE_NP:适应锁,解锁后重新竞争

(2)加锁,lock,trylock,lock阻塞等待锁,trylock立即返回EBUSY

(3)解锁,unlock需满足是加锁状态,且由加锁线程解锁

(4)清除锁,destroy(此时锁必需unlock,否则返回EBUSY,//Linux下互斥锁不占用内存资源

示例代码

?
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
#include <pthread.h>
#include "iostream"
using namespace std;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int tmp;
void* thread(void *arg)
{
    cout << "thread id is " << pthread_self() << endl;
    pthread_mutex_lock(&mutex);
    tmp = 12;
    cout << "Now a is " << tmp << endl;
    pthread_mutex_unlock(&mutex);
    return NULL;   
}
int main()
{
    pthread_t id;
    cout << "main thread id is " << pthread_self() << endl;
    tmp = 3;
    cout << "In main func tmp = " << tmp << endl;
    if (!pthread_create(&id, NULL, thread, NULL))
    {
        cout << "Create thread success!" << endl;
    }
    else
    {
        cout << "Create thread failed!" << endl;
    }
    pthread_join(id, NULL);
    pthread_mutex_destroy(&mutex);
    return 0;
}

编译: g++ -o thread testthread.cpp -lpthread

说明:pthread库不是Linux系统默认的库,连接时需要使用静态库libpthread.a,所以在使用pthread_create()创建线程,以及调用pthread_atfork()函数建立fork处理程序时,需要链接该库。在编译中要加 -lpthread参数。

转载于:https://www.cnblogs.com/qq78292959/archive/2013/01/17/2864302.html

3、Linux多线程,线程同步(转)相关推荐

  1. Linux多线程 | 线程同步

    文章目录 前言 主要介绍四种常用的线程同步方式以及相关的函数接口. 一.线程同步 二.同步方法 1.互斥锁 2.信号量 3.条件变量 4.读写锁 总结 前言 主要介绍四种常用的线程同步方式以及相关的函 ...

  2. Linux多线程的同步------读写锁

    前面介绍过Linux多线程同步的另外两个方法------互斥锁和信号量 Linux多线程的同步-----信号量和互斥锁_神厨小福贵!的博客-CSDN博客 下面来看一下读写锁: 读写锁和互斥锁都带有一个 ...

  3. Linux多线程的同步-----信号量和互斥锁

    前面两篇给基本概念讲过了,大家有兴趣的可以去看一下: Linux多线程_神厨小福贵!的博客-CSDN博客进程和线程的区别有哪些呢?进程是资源分配的最小单位,线程是CPU调度的最小单位进程有自己的独立地 ...

  4. linux c 线程同步的三种方法

    目录 一.互斥锁(mutex) 二.条件变量(cond) 三.信号量(sem) 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用 ...

  5. 9 C++ Boost 多线程,线程同步

    线程的创建 boost_thread,boost_system 多线程的创建 线程的参数传递 线程的创建方式 线程的join 加入join,回收线程线程中断 线程中断2, 线程组 boost 线程的死 ...

  6. Linux C线程同步的三种方法

    void* thr_fn1() {printf ("111111"); }int main() {int err;pthread_t tid;void *tret;err = pt ...

  7. Linux多线程---线程概念和线程控制

    线程概念 什么是线程? CPU视角: 与进程的关系: Linux下线程概念 那么CPU能分辨task_struct是进程和线程吗? 理解页表 为何以多级页表实现? 多级页表是如何实现的? 多级页表的优 ...

  8. java同步与死锁_Java多线程 - 线程同步与死锁

    一.线程同步 1)模拟多个用户同时从银行账户里面取钱 ● Account 类:银行账户类,里面有一些账户的基本信息,以及操作账户信息的方法 //模拟银行账户 classAccount {private ...

  9. 第18章 多线程----线程同步

    Java提供了线程同步的机制来防止资源访问的冲突. 1.线程安全 实际开发中,使用多线程程序的情况很多,如银行排号系统.火车站售票系统等.这种多线程的程序通常会发生问题. 以火车站售票系统为例,在代码 ...

  10. C#中的多线程-线程同步基础 (控制线程数量)

    同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成 锁系统 构成 目的 跨进程? 速度 loc ...

最新文章

  1. vue开发环境和生产环境里面解决跨域的几种方法
  2. python的实现和测试是啥意思_Python接口自动化测试之pytest与unittest区别
  3. 球体表面积原来还可以这么求!
  4. 如何为您的AWS账户设置多因素身份验证(MFA)
  5. java开发中实际遇到的问题总结_内行总结:装修中最容易遇到的16个问题及其解决方式!...
  6. SSM框架整合druid查看监控数据
  7. android studio按钮槽函数,AndroidStudio按钮Button退出程序
  8. html 自定义打印模板,HTML+CSS入门 自定义模板详解
  9. 开发运维日常坑 总结 51-100
  10. python常用函数使用
  11. oracle分析函数技术详解(配上开窗函数over())
  12. HMDD:miRNA相关疾病数据库
  13. 大数据智能营销笔记本人工智能下引入新的交互方式
  14. 卸载计算机系统,W7电脑系统如何卸载软件
  15. 游山西村 陆游- 南宋
  16. 04_服务注册Eureka
  17. bind错误:server can't find www.linuxprobe.com: SERVF
  18. dell服务器安装(dellemc服务器)
  19. vue修改编码_【Vue】为什么直接改node_modules里面的代码,不会生效?
  20. POI读取Excle模板中的数据(增强版)

热门文章

  1. 【编译】StreamInsight应用调优入门(一)——概述
  2. Exception Handling Application Block (5)详细解
  3. jsp网页上实现计算圆面积小程序
  4. 打造一个实际的全系统污点分析系统--Towards Practical Taint Tracking
  5. 走进C/C++函数的名字改编
  6. (24)FPGA面试题3分频器
  7. STM32 HAL库使用IIC
  8. 鼠标自动点击脚本_613个主流网站中发现点击劫持脚本
  9. 【嵌入式Linux】嵌入式Linux应用开发基础知识之I2C应用编程和SMBus协议及AP3216C应用编程
  10. 一个机房的所有计算机联成的网络应是,根据分布范围,一个机房的所有计算机联成的网络应是( )。...