多线程中的条件线程简单示例

1.原理:理解的条件线程最常见的用法就是两个线程同时对一个队列进行处理,比如一个线程负责在队列未满的时候插入item,另外一个线程负责在队列非空时取出item,条件线程涉及4个线程相关函数,pthread_mutex_lock、pthread_mutex_unlock、pthread_cond_wait、pthread_cond_signal,其中pthread_mutex_lock负责对线程加锁,以免其他线程同时对共享资源(比如本例中的int cond_num)进行修改,pthread_mutex_unlock对线程解锁,pthread_cond_wait用于阻塞自己这个线程,pthread_cond_signal用于唤醒其他线程,必须遵守pthread_mutex_lock、pthread_cond_wait、pthread_cond_signal、pthread_mutex_unlock的顺序。

2.代码示例

#define __USE_LARGEFILE64

#define _LARGEFILE64_SOURCE

#ifndef _GNU_SOURCE

#define _GNU_SOURCE

#endif

#include <stdio.h>

#include <stdlib.h>

#include<unistd.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <fcntl.h>

#include <string.h>

#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_cond_t cond_num_even = PTHREAD_COND_INITIALIZER;

pthread_cond_t cond_num_odd = PTHREAD_COND_INITIALIZER;

int cond_num = 1;

void *thread_function_even( )

{

long unsigned int thread_num = pthread_self();

int status = pthread_detach( thread_num ); /*detach to be an independent thread*/

while( 1 )

{

printf("enter thread_function_even,cond_num:%d\n",cond_num);

pthread_mutex_lock( &mutex );

while( 1 == cond_num % 2 )

pthread_cond_wait( &cond_num_even, &mutex );

printf("enter thread_function_even,before deal with cond_num,cond_num:%d\n",cond_num);

cond_num ++; /*cond_num become even,operate it*/

pthread_cond_signal( &cond_num_odd );/*wake odd function to see if it become odd*/

pthread_mutex_unlock( &mutex );

}

}

void * thread_function_odd( )

{

long unsigned int thread_num = pthread_self();

int status = pthread_detach( thread_num ); /*detach to be an independent thread*/

while( 1 )

{

printf("enter thread_function_odd,cond_num:%d\n",cond_num);

pthread_mutex_lock( &mutex );

while( 0 == cond_num % 2 )

pthread_cond_wait( &cond_num_odd, &mutex );

printf("enter thread_function_odd,before deal with cond_num,cond_num:%d\n",cond_num);

cond_num ++;/*cond_num become odd,operate it*/

pthread_cond_signal( &cond_num_even);/*wake even function to see if it become even*/

pthread_mutex_unlock( &mutex );

}

}

int main( void )

{

pthread_t thread;

pthread_create( &thread, NULL, &thread_function_even, NULL );

pthread_create( &thread, NULL, &thread_function_odd, NULL );

while(1); /*avoid thread‘s quit after main thread quit*/

}

结果:

gcc main.c -lpthread -g

./a.out 后的前几行结果解析

enter thread_function_even,cond_num:1 /*条件数为奇数,直接pthread_cond_wait阻塞跳出该函数直至条件数为偶数为止*/

enter thread_function_odd,cond_num:1 /*条件数符合奇数,跳过阻塞的代码行*/

enter thread_function_odd,before deal with cond_num,cond_num:1 /*处理条件数,条件数变为偶数,将even线程唤醒,因为还未发pthread_cond_wait阻塞自己,继续在odd的while循环中进行*/

enter thread_function_odd,cond_num:2 /*条件数为偶数,直接pthread_cond_wait阻塞跳出该函数直至条件数为奇数为止,因为even已唤醒,跳到even函数处理*/

enter thread_function_even,before deal with cond_num,cond_num:2 /*条件数为偶数,处理条件数*/

...

时间: 2024-10-05 09:15:24

多线程中的条件线程简单示例的相关文章

练习生产者与消费者-PYTHON多线程中的条件变量同步

以前练习过,但好久不用,手生,概念也生了, 重温一下.. URL: http://www.cnblogs.com/holbrook/tag/%E5%A4%9A%E7%BA%BF%E7%A8%8B/ ~~~~~~~ 互斥锁是最简单的线程同步机制,Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的acquire和release方法外,还提供了wait和notify方法.线程首先acquire一个条件变量,然后判断一些条件

java多线程中死锁情况的一个示例

下面是死锁情况的一个示例代码 package com.qust.demo.money; class A { public synchronized void foo(B b) { System.out.println(Thread.currentThread().getName() + " 进入A的foo"); try { Thread.sleep(200); } catch (InterruptedException ex) { ex.printStackTrace(); } Sys

PEP 3333中对WSGI的简单示例

本文只是对PEP3333中关于WSGI的例子的一个简单的记录,方便自己将来查看,若需要详细的信息,请自行查看PEP 3333的官方文档. WSGI中定义,application端是一个callable term(可以是function,class,method或者是一个实现了__call__方法的实例等),接受两个位置参数(名称不做要求):environ和start_response. environ是一个标准的python dict对象(不可以是子类),用于保存系统需要的变量. start_r

nginx中upstream模块的简单示例

本文所指的upstream是nginx的http模块中的内容对nginx来说,upstream可以在nginx上将后端服务器定义为服务器组,将不同后端不同的服务器划分为不同的组,再经过不同组内的调度算法实现负载均衡.和缓存设置类似,upstream需要先在http下定义,再被调用,方可正常使用.示例: http { -- upstream webserver { #定义名为webserver的组 server 192.168.1.111:80; server 192.168.1.222:80;

Linux内核中添加系统调用接口简单示例

1. Linux体系结构 Linux系统的地址空间分为用户空间和内核空间,通过系统调用和硬件中断能够完成从用户空间到内核空间的转移. 2. 系统调用接口 ① 一般情况下,用户进程不能访问内核空间.Linux内核中提供了一组用于实现各种系统功能的子程序,用户可以调用它们访问Linux内核的数据和函数,这些子程序称为系统调用接口(SCI). ② 系统调用和普通函数的区别:系统调用由操作系统内核实现,运行于内核态:普通函数调用由函数库或用户自己提供,运行于用户态. 3. 系统调用分类:主要分3大类 ①

Java程序中使用 Jsoup 爬虫( 简单示例 )

一.maven项目里pom添加jsoup依赖 <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.2</version> </dependency> 以抓取CSDN主页的右侧导航栏为例 代码示例: 1 package com.oukele.csdn_demo; 2 3 import org.

VS2010中xercesc配置及简单示例

从官网下载xerces-c-3.1.1并解压,打开工程项目 xerces-c-3.1.1\projects\Win32\VC10\xerces-all\xerces-all.sln, 选择XercesLib项目进行编译,生成相关库文件. 设置环境变量,添加xerces-c-3.1.1\Build\Win32\VC10\Debug. 新建项目工程,打开属性 配置属性: a. C/C++ ->常规->附加包含目录 xerces-c-3.1.1\src: b.链接器->常规->附加库目录

c#初学-多线程中lock用法的经典实例

本文转载自:http://www.cnblogs.com/promise-7/articles/2354077.html 一.Lock定义     lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断.它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待.这是通过在代码块运行期间为给定对象获取互斥锁来实现的. 在多线程中,每个线程都有自己的资源,但是代码区是共享的,即每个线程都可以执行相同的函数.这可能带来的问

Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二部分将第一部分的示例进行扩展,展示了如何在python中调用多线程的C模块:第三部分扩展了第二部分,增加了在C模块的线程中回调python的演示. 本文所用的环境为:64位Win7 + python 3.4 x86 + vs2010 一.windows下的C语言多线程程序 windows下多线程编程