Linux多线程及线程同步简单实例
一、多线程基本概念
1. 线程的基本概念
① 线程就是轻量级的进程
②线程和创建他的进程共享代码段、数据段
③线程拥有自己的栈
2. 在实际应用中,多个线程往往会访问同一数据或资源,为避免线程之间相互影响,需要引入互斥机制,而互斥锁(mutex)是互斥机制中的一种
3. 简单实例
#include <stdio.h>
#include <pthread.h> pthread_t work1Id;
pthread_t work2Id; int work1Ret = ;
int work2Ret = ; pthread_mutex_t mutex; int number = ; void* Work1(void* args)
{
int i = ; printf("I am work%d\n", *((int*)args)); for(i = ; i < ; i++)
{
pthread_mutex_lock(&mutex);
number++;
pthread_mutex_unlock(&mutex); printf("I am work%d, number = %d\n", *((int*)args), number); sleep();
} return &work1Ret;
} void* Work2(void* args)
{
int i = ; printf("I am work%d\n", *((int*)args)); for(i = ; i < ; i++)
{
pthread_mutex_lock(&mutex);
number++;
pthread_mutex_unlock(&mutex); printf("I am work%d, number = %d\n", *((int*)args), number); sleep();
} return &work2Ret;
} int main()
{
int args1 = ;
int args2 = ; void* work1Ret = NULL;
void* work2Ret = NULL; pthread_mutex_init(&mutex, NULL); pthread_create(&work1Id, NULL, Work1, &args1); pthread_create(&work2Id, NULL, Work2, &args2); pthread_join(work1Id, &work1Ret); if(work1Ret != NULL)
{
printf("work1Ret = %d\n", *((int*)work1Ret));
} pthread_join(work2Id, &work2Ret); if(work2Ret != NULL)
{
printf("work2Ret = %d\n", *((int*)work2Ret));
} return ;
}
二、线程同步
1. 多个线程按照规定的顺序来执行,即为线程同步。
2. 条件变量
①初始化
pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;
②等待条件成熟
pthread_wait(&cond_ready, &mutex); //会对mutex先进行解锁操作
③设置成熟条件
pthread_cond_signal(&cond_ready)
3. 简单实例
#include <stdio.h>
#include <pthread.h> pthread_t work1Id;
pthread_t work2Id; int work1Ret = ;
int work2Ret = ; pthread_cond_t cond_ready = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int number = ; void* Work1(void* args)
{
int i = ; printf("I am work%d\n", *((int*)args)); for(i = ; i < ; i++)
{
pthread_mutex_lock(&mutex);
number++; if(number >= )
{
printf("I am work%d, Finish\n", *((int*)args));
pthread_cond_signal(&cond_ready);
} pthread_mutex_unlock(&mutex); printf("I am work%d, number = %d\n", *((int*)args), number); sleep();
} return &work1Ret;
} void* Work2(void* args)
{ printf("I am work%d\n", *((int*)args));
pthread_mutex_lock(&mutex); if(number <= )
{
pthread_cond_wait(&cond_ready, &mutex); printf("I am work%d, number = %d\n", *((int*)args), number);
} return &work2Ret;
} int main()
{
int args1 = ;
int args2 = ; void* work1Ret = NULL;
void* work2Ret = NULL; pthread_create(&work1Id, NULL, Work1, &args1); pthread_create(&work2Id, NULL, Work2, &args2); pthread_join(work1Id, &work1Ret); if(work1Ret != NULL)
{
printf("work1Ret = %d\n", *((int*)work1Ret));
} pthread_join(work2Id, &work2Ret); if(work2Ret != NULL)
{
printf("work2Ret = %d\n", *((int*)work2Ret));
} return ;
}
Linux多线程及线程同步简单实例的更多相关文章
- C#多线程之线程同步篇1
在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...
- C#多线程之线程同步篇3
在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...
- C#多线程之线程同步篇2
在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...
- 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)
Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...
- Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronize ...
- MFC——9.多线程与线程同步
Lesson9:多线程与线程同步 程序.进程和线程是操作系统的重点,在计算机编程中.多线程技术是提高程序性能的重要手段. 本文主要解说操作系统中程序.进程和线程之间的关系,并通过相互排斥对象和事件对象 ...
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
[源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...
- 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent
[源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...
- IOS 多线程,线程同步的三种方式
本文主要是讲述 IOS 多线程,线程同步的三种方式,更多IOS技术知识,请登陆疯狂软件教育官网. 一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IO ...
随机推荐
- SpringBoot10 整合JSP
1 整合JSP 1.1 导入相关依赖 JSP依赖.JSTL依赖 <?xml version="1.0" encoding="UTF-8"?> < ...
- 适合新手的Python爬虫小程序
介绍:此程序是使用python做的一个爬虫小程序 爬取了python百度百科中的部分内容,因为这个demo是根据网站中的静态结构爬取的,所以如果百度百科词条的html结构发生变化 需要修改部分内容. ...
- ENCODE:DNA 分子元件的百科全书
ENCODE(DNA分子元件的百科全书)是由国家人类基因研究所(NHGRI)资助的一个国际研究联盟, 该联盟的目标是:建立一份综合的人类基因组功能元件的清单,这些基本元件包括那些直接作用蛋白质和RNA ...
- C#.Net使用正则表达式抓取百度百家文章列表
工作之余,学习了一下正则表达式,鉴于实践是检验真理的唯一标准,于是便写了一个利用正则表达式抓取百度百家文章的例子,具体过程请看下面源码: 一:获取百度百家网页内容 public List<str ...
- json序列化.xml序列化.图片转base64.base64转图片.生成缩略图.IEnumerable<TResult> Select<TSource, TResult>做数据转换的五种方式
JSON序列化 /// <summary> /// JSON序列化 /// </summary> public static class SPDBJsonConvert { ...
- 实现基于dotnetcore的扫一扫登录功能
第一次写博客,前几天看到.netcore的认证,就心血来潮想实现一下基于netcore的一个扫一扫的功能,实现思路构思大概是web端通过cookie认证进行授权,手机端通过jwt授权,web端登录界面 ...
- SoftKeyboard在AndroidStudio下的配置和运行
前文翻译的<Android下创建一个输入法>一文中提到了来自Google的输入法例程SoftKeyboard,备忘下该程序的配置和运行. 首先将SoftKeyboard导入AndroidS ...
- VMWare 装mac os x 一个必备优化神器 beamoff
https://blog.csdn.net/whitehack/article/details/47074403/ VMWare 装mac os x 一个必备优化神器 beamoff 2015年07月 ...
- uoj#453. 【集训队作业2018】围绕着我们的圆环(线性代数+递推)
题面 传送门 题解 我对线代一无所知 如果下面有啥说错的地方请说出来省的我一辈子都搞不明白 如果你没看懂以下在讲什么不要紧,因为我也没看懂 首先,关于\(A\times B \equiv C \pmo ...
- luogu1447 [NOI2010]能量采集 莫比乌斯反演
link 冬令营考炸了,我这个菜鸡只好颓废数学题了 NOI2010能量采集 由题意可以写出式子: \(\sum_{i=1}^n\sum_{j=1}^m(2\gcd(i,j)-1)\) \(=2\sum ...