一、多线程基本概念

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. 学习Javascript的书籍(转)

    学习Javascript的书籍   作者: 阮一峰 日期: 2008年1月 9日 昨天,ppip同学留言: 你的js主要是用什么材料学的?推荐用哪本教程呢? 我想了一下,发现自己还真的读过不少书.我在 ...

  2. 写一个函数封装printf用作trace

    转自http://blog.csdn.net/coder_weisong/article/details/10285291     写一个函数封装printf用作trace   方法一:   #inc ...

  3. ubuntu下使用PIL中的show函数,无法显示图片的问题

    问题描述:ubuntu14.04系统,python2.7(version),正在学习python中, from PIL import Image im = Image.open('1.jpg') im ...

  4. Luogu 3586 [POI2015]LOG

    考虑离散化后开权值线段树. 设序列中不小于$s$的数有$cnt$个,小于$s$的数的和为$sum$. 那么操作Z能成功的充要条件是$sum \geq (c - cnt) * s$. 如果序列中不小于$ ...

  5. 安装Maven及Eclipse中配置Maven

    下载maven版本: 1.进入官网:http://maven.apache.org/download.cgi   ,下载编译后的maven版本:如图下: 2.创建一个目录,把下载的maven压缩包,进 ...

  6. WordCount小程序及测试

    Github项目地址:https://github.com/792450735/wc PSP表格: PSP2.1表格[1] PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Plann ...

  7. Bootstrap 的 Dropdown

    一.简介 Dropdown 就是下拉列表,这里 有一个例子. Dropdown 的完整代码如下: <div id="dropdownWrapper"> <butt ...

  8. String的split(String regex, int limit)方法小结

    split(String regex, int limit)方法,头一个参数String regex表示字符串分割的模式,包括分隔符和正则表达式:但是第二个参数limit比较迷糊人,api中这样解释: ...

  9. LSI阵列卡进行高效管理

    LSI公司(LSI Corporation)(NASDAQ:LSI)(中文:艾萨华)是一家总部位于加利福尼亚州米尔皮塔斯 (Milpitas) 的半导体和软件领先供应商,其主要产品包括:RAID控制器 ...

  10. unity编辑器拓展

    [ExecutelnEditMode]     在EditMode下也可以执行脚本,Unity默认情况下,脚本只有运行时被执行,加上此属性后,不运行程序也能执行.与PlayMode不同的是函数不会不停 ...