线程的使用
1.线程的创建
线程的相关操作放在中。
1.1我们定义一个线程,首先要进行定义一个函数,类似我们创建一个a线程
void *thread_a(void *in){
printf("Im thread_a\n");
pthread_exit((void*)0);
}
1.2.创建一个线程
pthread_t a;//声明
pthread_create(&a,NULL,thread_a,(void*)0);//创建线程
1.3.创建3个线程并且打印(如果你打印1000个,并且睡一秒,会发现,这个进程实际上运行是无序的)
#include
#include
void *thread_a(void *in){
printf("Im thread_a\n");
pthread_exit((void*)0);
}
void *thread_b(void *in){
printf("Im thread_b\n");
pthread_exit((void*)0);
}
void *thread_c(void *in){
printf("Im thread_c\n");
pthread_exit((void*)0);
}
int main(){
pthread_t a,b,c;
int val;
/**create thread a,b,c*/
pthread_create(&a,NULL,thread_a,(void*)0);
pthread_create(&b,NULL,thread_b,(void*)0);
pthread_create(&c,NULL,thread_c,(void*)0);
/**main thread waits for termination of a,b,c*/
pthread_join(a,(void**)0);
pthread_join(b,(void**)0);
pthread_join(c,(void**)0);
printf("Main thread is over\n");
return 0;
}
3.如果我们希望线程进行打印顺序为c,b,a,那么我们可以定义一个信号。
线程a等待线程2的信号,线程2等待线程3的信号
#include
#include
#include //sem_wait sem_init这些方法全在里面
sem_t sem1;
sem_t sem2;
void *thread_a(void *in){
sem_wait(&sem1);/*wait for sem1*/
printf("Im thread_a\n");
pthread_exit((void*)0);
}
void *thread_b(void *in){
sem_wait(&sem2);/*wait for sem2*/
printf("Im thread_b\n");
sem_post(&sem1);/*increase sem1 by 1,make thread_a run*/
pthread_exit((void*)0);
}
void *thread_c(void *in){
printf("Im thread_c\n");
sem_post(&sem2);/*increase sem2 by 1,make thread_b run*/
pthread_exit((void*)0);
}
int main(){
pthread_t a,b,c;
int val;
/**init sem1 sem2 to 0,any thread waits for it will be blocked*/
sem_init(&sem1,0,0);
sem_init(&sem2,0,0);
/**create thread a,b,c*/
pthread_create(&a,NULL,thread_a,(void*)0);
pthread_create(&b,NULL,thread_b,(void*)0);
pthread_create(&c,NULL,thread_c,(void*)0);
/**main thread waits for termination of a,b,c*/
pthread_join(a,(void**)0);
pthread_join(b,(void**)0);
pthread_join(c,(void**)0);
printf("Main thread is over\n");
/*destroy sem1,sem2*/
sem_destroy(&sem1);
sem_destroy(&sem2);
return 0;
}
2.锁的创建和使用
2.1.mutex互斥锁的创建
互斥锁的内容:我们要想创建一个互斥锁,首先是对这个mutex进行初始化操作。
互斥锁的头文件在中。
pthread_mutex_t mutex;//声明一个锁
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
//加锁和解锁操作
pthread_mutex_destory(&mutex);//销毁锁的操作
2.2.编写一个读写(线程分离)的程序,读一个空串,然后写进另一个数组里面
#include
#include
#include
#include
pthread_mutex_t mutex;
char buf[80],buf1[80];
int n,buf_has_item=0;
void writer_function(void){
while(1){
pthread_mutex_lock(&mutex);
if(buf_has_item==0){
printf("等待从键盘读一个非空串:\n");
if((n=read(0,buf,sizeof(buf)))>0)
buf_has_item=1;
printf("A thread write:%s\n",buf);
}
pthread_mutex_unlock(&mutex);
}
}
void reader_function(void){
while(1){
pthread_mutex_lock(&mutex);
if(buf_has_item==1){
strcpy(buf1,buf);
buf_has_item=0;
printf("A thread read:%s\n",buf1);
}
pthread_mutex_unlock(&mutex);
}
}
void *thread_reader(void *in){
reader_function();
pthread_exit((void**)0);
}
int main(){
pthread_t reader,writer;pthread_t ptr;
pthread_mutex_init(&mutex,NULL);
pthread_create(&ptr,NULL,thread_reader,(void*)0);//创建一个线程
writer_function();
pthread_join(ptr,(void**)0);
return 0;
}
CreateThread创建线程 互斥量锁
HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD:线程安全相关的属性,常置为NULL SIZE_T dwStackS ...
UNIX网络编程卷1 server程序设计范式7 预先创建线程,以相互排斥锁上锁方式保护accept
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.预先创建一个线程池.并让每一个线程各自调用 accept 2.用相互排斥锁代替让每一个线 ...
JVM学习记录-线程安全与锁优化(一)
前言 线程:程序流执行的最小单元.线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址.文件I/O等),又可以独立调度(线程是C ...
02 如何创建线程 线程并发与synchornized
所有程序运行结果 请自行得出 创建线程方式一:继承Thread类 步骤: 1,定义一个类继承Thread类. 2,覆盖Thread类中的run方法. 3,直接创建Thread的子类对象创建线程. 4, ...
UI:多线程 、用GCD创建线程
什么是应用(程序):就是我们编写的代码编译后生成的app文件 进程:凡是一个运行的程序都可以看作为一个进程,如打开的多个 word,就可以认为是一个进程的多个线程. 线程:至少有一个线程就是主线程,网 ...
偏向锁,偏向线程id ,自旋锁
理解锁的基础知识 如果想要透彻的理解Java锁的来龙去脉,需要先了解以下基础知识. 基础知识之一:锁的类型 锁从宏观上分类,分为悲观锁与乐观锁. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发 ...
多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
C语言实现线程池
以前写过一篇关于如何使用多线程推升推送速度(http://www.cnblogs.com/bai-jimmy/p/5177433.html),能够到达5000qps,其实已经可以满足现在的业务,不过在 ...
随机推荐
alter table的用法
在数据库开发过程中,除了用得最多的数据库查询外,我们有时也需要去修改数据表的定义,比如在已存在的数据表中新增列和删除列等.这篇文章就总结一下alter table语句的用法. 示例代码如下. USE ...
6.django笔记之orm
作者:刘耀 一.Django-orm 关系对象映射(Object Relational Mapping,简称ORM). 2.在django里 我们写的类表示数据库的表 如果根据这个类创建的对象是数据库 ...
python代码中pass的用法
我们有时会在方法中写一些注释代码,用来提示这个方法是干嘛的之类,看下面代码: class Game_object: def __init__(self, name): self.name = name ...
Android - 直线(line)画法
Android - 直线(line)画法 本文地址: http://blog.csdn.net/caroline_wendy 横线(horizontal line)
【BZOJ3157/3516】国王奇遇记(数论)
[BZOJ3157/3516]国王奇遇记(数论) 题面 BZOJ3157 BZOJ3516 题解 先考虑怎么做\(m\le 100\)的情况. 令\(f(n,k)=\displaystyle \sum ...
MySQL数据库查询中的特殊命令
第一: MySQL的安装 下载MySQL软件,修改安装路径之后 安装数据库MySQL5.7.18 第一步:数据库MySQL5.7.18可以在官网上下载对应的版本,下载地址:http://www.f ...
20135202闫佳歆--week6 分析Linux内核创建一个新进程的过程——实验及总结
week 6 实验:分析Linux内核创建一个新进程的过程 1.使用gdb跟踪创建新进程的过程 准备工作: rm menu -rf git clone https://github.com/mengn ...
Informix存储过程
一.存储过程概述 存储过程是一个用户定义的函数,由存储过程语句(SPL) 和一组SQL语句组成,以可以执行代码形式存储在数据库中,和表.视图.索引等一样,是数据库的一种对象. 存储过程语言SPL(St ...
Cobbler的Web管理和维护
Cobbler的Web管理模块和命令行模块是可以分开工作的,没有依赖关系. 1 WebUI的功能 查看所有的对象和配置文件 添加或者删除system,distro, profile 执行“cobble ...
树莓派raspberry Pi2 介绍
Compared to the Raspberry Pi 1 it has: A 900MHz quad-core ARM Cortex-A7 CPU 1GB RAM Like the (Pi 1) ...