c语言 线程读写,C语言创建线程以及使用锁进行读写分离

线程的使用

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) ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值