一、多线程基本概念

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多线程及线程同步简单实例的更多相关文章

  1. C#多线程之线程同步篇1

    在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...

  2. C#多线程之线程同步篇3

    在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...

  3. C#多线程之线程同步篇2

    在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...

  4. 关于Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇高质量的博文)

    Java多线程的线程同步和线程通信的一些小问题(顺便分享几篇质量高的博文) 前言:在学习多线程时,遇到了一些问题,这里我将这些问题都分享出来,同时也分享了几篇其他博客主的博客,并且将我个人的理解也分享 ...

  5. Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronize ...

  6. MFC——9.多线程与线程同步

    Lesson9:多线程与线程同步 程序.进程和线程是操作系统的重点,在计算机编程中.多线程技术是提高程序性能的重要手段. 本文主要解说操作系统中程序.进程和线程之间的关系,并通过相互排斥对象和事件对象 ...

  7. 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock

    [源码下载] 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLoc ...

  8. 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEvent, AutoResetEvent

    [源码下载] 重新想象 Windows 8 Store Apps (47) - 多线程之线程同步: Semaphore, CountdownEvent, Barrier, ManualResetEve ...

  9. IOS 多线程,线程同步的三种方式

    本文主要是讲述 IOS 多线程,线程同步的三种方式,更多IOS技术知识,请登陆疯狂软件教育官网. 一般情况下我们使用线程,在多个线程共同访问同一块资源.为保护线程资源的安全和线程访问的正确性. 在IO ...

随机推荐

  1. contentvalue的探究(结构,用途)

    contentvalue类似HASHMAP,但是KEY只能为STRING 该类用于数据库操作时对数据的封装,可以避免使用SQL语句,为后期创建CONTENTPROVIDER提供便利. 如果没有上述需求 ...

  2. cf688B-Lovely Palindromes

    http://codeforces.com/problemset/problem/688/B B. Lovely Palindromes time limit per test 1 second me ...

  3. Windows版本Apache+php的Xhprof应用

    [知识] {Apache} Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一. {PHP} ...

  4. DOM 操作属性

    DOM操作就是针对对象的操作 先写一个按钮,<input tupe="button" value=""  id="id">  这 ...

  5. hibernate里的实体类中不能重写toString

    @Test报堆栈溢出,   在main中报错toString

  6. essential C++中关于面向过程和面向对象的说明

    昨天在阅读essential C++中看到了一个关于面向过程和面向对象的区别的例子,感觉挺好的.记录下来.... 这个例子是关于照相机的.照相机有三个性质,一个是控制位置:通常使用3个浮点数据来表示其 ...

  7. Android 中的菜单 OptionsMenu的简单应用

    OptionsMenu就是安卓手机中的菜单选项 首先 要实现对菜单的操作就要先重写OnCreateOptionsMenu(Menu menu)方法 通常有两种方法来实现对菜单中选项的添加 第一种是动态 ...

  8. 《Effective Java》第8章 通用程序设计

    第47条:了解和使用类库 Top 100 Java Libraries on Github 2016 Library Number of Projects Type % of projects jun ...

  9. Json数据导出生成Excel

    最近在做一个导入导出Excel的功能,导出其他类型的文件都比较熟悉,但是导入跟导出一个Excel还是稍微特殊点.根据这次的经验,写了个导出的小样例. 总体思路就是json数据的key,value跟Ex ...

  10. [raspberry pi3] 串口线使用

    直接上图 GPIO 口说明: 串口线连接: 参考地址: http://bbs.elecfans.com/jishu_596578_1_1.html