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 ...
随机推荐
- python NLTK 环境搭建
这里是我之前亲自操作过安装nltk,安装成功了.当时记得是参考这篇博文:http://www.tuicool.com/articles/VFf6Bza 其中,nltk安装时,遇到模块未找到,依次根据提 ...
- HDOJ 4802 GPA
Problem Description In college, a student may take several courses. for each course i, he earns a ce ...
- 为什么一些公司把dwg文件转化为pdf
是因为dwg文件中可能会涉及到字体问题 这台电脑打开dwg没问题,另一台电脑可能没有相应的字体用autocad打开就会出现乱码,所以先转化为pdf,而pdf有固定格式的作用,能够保证一台电脑打开是什么 ...
- Qt嵌入式开发环境搭建
一.Qt版本介绍 按照不同的图形界面来划分,分为四个版本: 1.Win32版:适用于windows平台 2.X11版:适用于各种X系统的Linux和Unix平台 3.Mac版:适用于苹果的MacOS ...
- python 获取路径不同方法的比较
在软件中经常需要获取文件所在路径,方法有很多种( 例如 os.path.realpath(__file__), os.getcwd(), os.path.abspath(__file__), sys ...
- C++面试笔记--单链表
1.编程实现单链表删除节点. 解析:如果删除的是头节点,如下图: 则把head指针指向头节点的下一个节点.同时free p1,如下图所示: 如果删除的是中间节点,如下图所示: 则用p2的n ...
- VS2012,更新补丁后--创建项目未找到与约束匹配的导出
更新过一次漏洞,后来尝试建立一个项目,结果错误终于暴露了,创建项目时无法成功创建,而且提示:未找到与约束ontractNameMicrosoft.VisualStudio.Text.ITextDocu ...
- java java启动方式
java启动方式 两种方案: 1.守护进程方式启动: java –jar命令: 例如:C:\eclise\work\test.jar C:\eclise\work\test.java 打开dos:输 ...
- CS基本网络中Agent使用双网卡进行流量划分
两台服务器,一台服务器作为管理节点[单网卡],一台服务器作为计算节点[双网卡] ------------------------------------------------------------ ...
- 正经学C#_判断[IF语句]:[c#入门经典]
判断语句几乎是最为常用的语句之一,是最有效的. 先说IF语句,IF语句也是属于分支的一种,用来控制流程的. IF的语句是这样的 IF(xxx 条件) { //代码块 } ,b; ) { b=a--; ...