#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h> #define MAX_COUNT 9
pthread_mutex_t mutex; //互斥变量
pthread_cond_t cond; //条件变量
int count = 0; void AddCount_Odd_Func(void);
void AddCount_Even_Func(void); int main()
{
int ret;
pthread_t odd_thread, even_thread; //两个线程
pthread_attr_t thread_attr; //线程的属性结构 count = 0;
pthread_mutex_init(&mutex, NULL); //互斥变量的初始化
pthread_cond_init(&cond, NULL); //条件变量的初始化
ret = pthread_attr_init(&thread_attr); //属性结构体初始化
if (ret != 0)
{
perror("Attribute Creation Failed!");
exit(EXIT_FAILURE);
} pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED); //设置线程分离状态的函数,PTHREAD_CREATE_DETACHED(分离线程):不需要创建线程的线程等待
//函数运行结束线程便终止,同时释放占用的系统资源
ret = pthread_create(&odd_thread, &thread_attr, (void *)&AddCount_Odd_Func, NULL);
if (ret != 0)
{
perror("Thread Creation Failed!");
exit(EXIT_FAILURE);
}
ret = pthread_create(&even_thread, &thread_attr, (void *)&AddCount_Even_Func, NULL);
if (ret != 0)
{
perror("Thread Creation Failed!");
exit(EXIT_FAILURE);
} while (count < MAX_COUNT);
printf("Finished!\n");
pthread_cond_destroy(&cond); //销毁条件变量
pthread_mutex_destroy(&mutex);
return 0;
} void AddCount_Odd_Func(void)
{
pthread_mutex_lock(&mutex);
while (count < MAX_COUNT)
{
if (count % 2 == 1)
{
count++;
printf("AddCount_Odd_Func(): count = %d.\n", count);
pthread_cond_signal(&cond); //用来释放被阻塞在条件变量cond上的线程
}
else
pthread_cond_wait(&cond, &mutex); //使线程阻塞在条件变量cond上
}
pthread_mutex_unlock(&mutex);
} void AddCount_Even_Func(void)
{
pthread_mutex_lock(&mutex);
while (count < MAX_COUNT)
{
if (count % 2 == 0)
{
count++;
printf("AddCount_Even_Func(): count = %d.\n", count);
pthread_cond_signal(&cond);
}
else
pthread_cond_wait(&cond, &mutex);
}
pthread_mutex_unlock(&mutex);
}

gcc example.c -lpthread

运行结果如下:

Linux多线程的一个小例子的更多相关文章

  1. java连接mysql的一个小例子

    想要用java 连接数据库,需要在classpath中加上jdbc的jar包路径 在eclipse中,Project的properties里面的java build path里面添加引用 连接成功的一 ...

  2. java操作xml的一个小例子

    最近两天公司事比较多,这两天自己主要跟xml打交道,今天更一下用java操作xml的一个小例子. 原来自己操作xml一直用这个包:xstream-1.4.2.jar.然后用注解的方式,很方便,自己只要 ...

  3. MVVM模式的一个小例子

    使用SilverLight.WPF也有很长时间了,但是知道Binding.Command的基本用法,对于原理性的东西,一直没有深究.如果让我自己建一个MVVM模式的项目,感觉还是无从下手,最近写了一个 ...

  4. C语言多线程的一个简单例子

    多线程的一个简单例子: #include <stdio.h> #include <stdlib.h> #include <string.h> #include &l ...

  5. 使用Trinity拼接以及分析差异表达一个小例子

    使用Trinity拼接以及分析差异表达一个小例子  2017-06-12 09:42:47     293     0     0 Trinity 将测序数据分为许多独立的de Brujin grap ...

  6. c# BackGroundWorker 多线程操作的小例子

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

  7. 关于SVN配置文件的一个小例子

    1   背景假设 厦门央瞬公司是一家电子元器件设备供应商,其中有个ARM部门,专门负责ARM芯片的方案设计.销售,并在北京.上海各设立了一个办事处.对于工作日志,原先采用邮件方式发给经理,但是这种方式 ...

  8. c# BackGroundWorker 多线程操作的小例子 (转)

    在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...

  9. 从一个小例子认识SQL游标

    1    什么是游标: 关系数据库中的操作会对整个行集起作用. 例如,由 SELECT 语句返回的行集包括满足该语句的 WHERE 子句中条件的所有行. 这种由语句返回的完整行集称为结果集. 应用程序 ...

随机推荐

  1. PHP file_get_contents() 函数

    定义和用法 file_get_contents() 函数把整个文件读入一个字符串中. 和 file() 一样,不同的是 file_get_contents() 把文件读入一个字符串. file_get ...

  2. 【Uva11212】 Editing a Book(IDA*)

    [题意] 有n个数字的全排列,每次可以剪切一段粘贴到某个位置.问最后变成升序最少多少步. 如"{2,4,1,5,3,6}要2步 {3,4,5,1,2}只要一步 [分析] 迭代深搜真的AC了也 ...

  3. mysql查看'datadir'目录

    mysql查看创建的数据库的数据,包含表等存放的目录,可以输入下面指令查看: show variables like 'datadir'

  4. Ubuntu 14.04数据库服务器--mysql的安装和配置

    mysql是Oracle公司的一种开放源代码的关系型数据库管理系统,被广泛应用于各中小网站,是一种跨平台的数据库管理系统,现在介绍一下如何在Ubuntu 14.04上安装和配置mysql 1. 更新源 ...

  5. SPRING IN ACTION 第4版笔记-第八章Advanced Spring MVC-004-Pizza例子的用户流程(flowExecutionKey、_eventId_phoneEntered、flowExecutionUrl )

    一. 1. 2. 3.customer-flow.xml 自己定义customer,最后output <?xml version="1.0" encoding="U ...

  6. 第二章 LM3S USB处理器

    2.1 LM3S处理器简介 Luminary Micr公司Stellaris所提供一系列的微控制器是首款基于Cortex-m3的控制器,它们为对成本尤其敏感的嵌入式微控制器应用方案带来了高性能的32位 ...

  7. Protel封装库

    一.目录下面的一些封装库中,根据元件的不同封装我们将其封装分为二大类:一类是分立元件的封装,一类是集成电路元件的封装 1.分立元件类: 电容:电容分普通电容和贴片电容: 普通电容在Miscellane ...

  8. 点点滴滴-ConfigurationManager.AppSettings

    在写程序的配置文件,里面添加了几个配置,下面是appSettings节点的设置 <appSettings> <add key="StyleFolder" valu ...

  9. bzoj2527

    首先环可以变成链来处理,对于l>r的情况就是修改区间[1,r],[l,mx]然后不难想到整体二分,二分答案k,然后算1~k场流星雨对国家的贡献然后判定将国家划分变成子问题解决,没什么难的终于不是 ...

  10. MS dos版本

    1981年,MS-DOS 1.0发行,作为IBM PC的操作系统进行捆绑发售,支持16k内存及160k的5寸软盘.在硬件昂贵,操作系统基本属于送硬件奉送的年代,谁也没能想到,微软公司竟会从这个不起眼的 ...