linux线程操作
初始化条件变量
int pthread_cond_init(pthread_cond_t *cv,pthread_cond_attr *cattr);
函数返回值:返回0表示成功,返回其他表示失败。
参数: pthread_cond_attr是用来设置pthread_cond_t的属性,当传入的值是NULL的时候表示使用默认的属性。
函数返回时,创建的条件变量保存在cv所指向的内存中,可以用宏PTHREAD_COND_INITIALIZER来初始化条件变量。值得注意的是不能使用多个线程初始化同一个条件变量,当一个线程要使用条件变量的时候确保它是未被使用的。
条件变量的销毁
int pthread_cond_destroy(pthread_cond_t *cv);
返回值:返回0表示成功,返回其他值表示失败。
条件变量的使用:
int pthread_cond_wait(pthread_cond_t *cv,pthread_mutex_t *mutex)
int pthread_cond_signal(pthread_cond_t *cv);
使用方式如下:
pthread_mutex_lock(&mutex)
while or if(线程执行的条件是否成立)
pthread_cond_wait(&cond,&mutex);
线程执行
pthread_mutex_unlock(&mutex);
为什么要加锁
- 线程在执行的部分访问的是进程的资源,有可能多个线程需要访问它,为了避免由于线程并发执行所引起的资源竞争,所以要让每个线程互斥的访问公共资源。
- 如果while或if判断不满足线程的执行条件时,线程回调用pthread_cond_wait阻塞自己。pthread_cond_wait被调用线程阻塞的时候,pthread_cond_wait会自动释放互斥锁。线程从调用pthread_cond_wait到操作系统把他放在线程等待队列之后的时候释放互斥锁。
使用while和if判断线程执行条件释放成立的区别。
在多线程资源竞争的时候,在一个使用资源的线程里面(消费者)判断资源是否可用,不可用便调用pthread_cond_wait,在另一个线程里面(生产者)如果判断资源可用的话,则会调用pthead_cond_signal发送一个资源可用的信号。
但是在wait成功之后,资源就不一定可以被使用,因为同时有两个或两个以上的线程正在等待次资源,wait返回后,资源可能已经被使用了,在这种情况下
while(resource == FALSE)
pthread_cond_wait(&cond,&mutex);
如果之后只有一个消费者,就可使用if。
分解pthread_cond_wait动作为以下步骤:
- 线程放在等待队列上,解锁
- 等待pthread_cond_signal或者pthread_cond_broadcast信号之后去竞争锁
- 若竞争到互斥锁则加锁
有可能多个线程在等待这个资源可用的信号,信号发出去之后只有一个资源可用,但是有A,B两个线程在等待,B速度比较快,获得互斥锁,然后加锁,消耗资源,然后解锁,之后A获得互斥锁,但它回去发现资源已经被使用了,它便有两个选择,一个失去访问不存在的资源,另一个就是继续等待,那么等待下去的条件就是使用while,要不然使用if的话pthread_cond_wait返回后,就会顺序执行下去。
等待线程:
pthread_cond_wait 前要加锁
pthread_cond_wait 内部会解锁,然后等待条件变量被其他线程激活
pthread_cond_wait 被激活后会再自动加锁
激活线程
加锁(和等待线程用同一个锁)
pthread_cond_signal 发送信号(阶跃信号前最后判断有无等待线程)
解锁
激活线程的上面三个操作再运行时间上都是再等待线程的pthread_cond_wait函数内部。
/***
pthread_if.c
***/
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; int count = ; void *decrement(void *arg)
{
printf("in derment\n");
pthread_mutex_lock(&mutex);
if(count == )
pthread_cond_wait(&cond,&mutex);
count--;
printf("----decrement:%d\n",count);
printf("out decrement\n");
pthread_mutex_unlock(&mutex);
return NULL;
} void *increment(void *arg)
{
printf("in increment\n");
pthread_mutex_lock(&mutex);
count++;
printf("-----increment:%d\n",count);
if(count != )
{
pthread_cond_signal(&cond);
}
printf("out increment\n");
pthread_mutex_unlock(&mutex);
return NULL;
} int main()
{
pthread_t tid_in,tid_de;
pthread_create(&tid_de,NULL,(void*)decrement,NULL);
sleep();
pthread_create(&tid_in,NULL,(void*)increment,NULL);
sleep(); pthread_join(tid_de,NULL);
pthread_join(tid_in,NULL);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return ;
}
/***
pthread_while.c
***/
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
#include<unistd.h> typedef struct node_s
{
int data;
struct node_s *next;
}node_t; node_t *head = NULL; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; void cleanup_handler(void *arg)
{
printf("cleanup_handler is running.\n");
free(arg);
pthread_mutex_unlock(&mutex);
} void *thread_func(void *arg)
{
node_t *p = NULL;
pthread_cleanup_push(cleanup_handler,p);
while()
{
pthread_mutex_lock(&mutex);
while(NULL == head)
pthread_cond_wait(&cond,&mutex);
p = head;
head = head->next;
printf("process %d node\n",p->data);
free(p);
pthread_mutex_unlock(&mutex);
}
pthread_cleanup_pop();
return NULL;
} int main()
{
pthread_t tid;
node_t *temp = NULL;
int i;
pthread_create(&tid,NULL,(void*)thread_func,NULL); for(i = ; i < ; i++)
{
temp = (node_t*)malloc(sizeof(node_t));
temp->data = i;
pthread_mutex_lock(&mutex);
temp->next = head;
head = temp;
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
sleep();
}
pthread_cancel(tid);
pthread_join(tid,NULL);
return ; }
linux线程操作的更多相关文章
- linux 线程操作问题undefined reference to 'pthread_create'的解决办法(cmake)
问题原因: pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 libpthread.a. 所以在使用pthread_create()创建线程时,需要链接该库. 1. 终端:问题解 ...
- 8)Linux程序设计入门--线程操作
)Linux程序设计入门--线程操作 前言:Linux下线程的创建 介绍在Linux下线程的创建和基本的使用. Linux下的线程是一个非常复杂的问题,由 于我对线程的学习不时很好,我在这里只是简单的 ...
- linux线程
线程:轻量级进程,在资源.数据方面不需要进行复制 不间断地跟踪指令执行的路径被称为执行路线 进程的结构:task_struck:地址空间 线程:轻量级的进程 在同一个进程中创建的线程,在共享进程的地址 ...
- [转载]Linux 线程实现机制分析
本文转自http://www.ibm.com/developerworks/cn/linux/kernel/l-thread/ 支持原创.尊重原创,分享知识! 自从多线程编程的概念出现在 Linux ...
- linux线程的实现
首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个分身可以处理一件特定事情.这在处理异步事件如异步IO时特别有用.内核线程的使用是廉价的,唯一使用 ...
- linux线程的实现【转】
转自:http://www.cnblogs.com/zhaoyl/p/3620204.html 首先从OS设计原理上阐明三种线程:内核线程.轻量级进程.用户线程 内核线程 内核线程就是内核的分身,一个 ...
- Linux线程-创建
Linux的线程实现是在内核以外来实现的,内核本身并不提供线程创建.但是内核为提供线程[也就是轻量级进程]提供了两个系统调用__clone()和fork (),这两个系统调用都为准备一些参数,最终都用 ...
- Linux线程学习(一)
一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...
- Linux线程学习(二)
线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换 线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...
随机推荐
- .NET母版页实例(UI页面)
全文注释: 1.<!DOCTYPE>声明位于文档中的最前的位置,处于<html>标签之前. 2.此标签可告知浏览器文档使用哪种HTML或XHTML规范 3.<!DOCTY ...
- java之hibernate之基于外键的双向一对一关联映射
这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements ...
- MySQL数据库连接报错
数据库版本8.x和其他版本配置有区别: 1. 驱动依赖和连接 报错: Could not create connection to database server - java mysql conne ...
- Wenaox 一款轻量性能好的微信小程序状态管理库
感慨一下!!! 从开始开发 wenaox 从开始到现在,,时不时更新一下,改一改 bug,却发现已经快 1 年了 orz 虽然很少人用 hhh,但偶尔也会有人提一些问题,我就知道还有人用的~ 感兴趣的 ...
- el-pagination分页优化
表格分页优化: <template> <el-pagination small background @size-change="handleSizeChange" ...
- iptables-2基本语法结构
1.规则的概念先说说规则的概念,然后再通俗的解释它.规则:根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理:那么我们来通俗的解释一下什么是iptable ...
- Android笔记(六十四) android中的动画——补间动画(tweened animation)
补间动画就是只需要定义动画开始和结束的位置,动画中间的变化由系统去补齐. 补间动画由一下四种方式: 1.AplhaAnimation——透明度动画效果 2.ScaleAnimation ——缩放动画效 ...
- com.mysql.jdbc.Driver not loaded. Are you sure you've included the correct jdbc driver in :jdbc_driver_library?
把对应的jdbc jar包放到 /usr/share/logstash/logstash-core/lib/jars/路径 下即可.可以在配置文件不用配置驱动库.
- IDEA实用教程(九)—— 创建Servlet
4. 创建Servlet 1) 第一步 2) 第二步 3) 第三步 4) 第四步 由于新创建的Web项目, 没有Tomcat环境, 所以创建的Servlet会发生导包错误,如下图所示 : 因此我们需要 ...
- 《代码敲不队》第九次团队作业:Beta冲刺第3天
项目 内容 这个作业属于哪个课程 任课教师博客主页链接 这个作业的要求在哪里 作业链接地址 团队名称 代码敲不队 作业学习目标 (1)项目文档的完善与整理:(2)团队项目总结陈述PPT编制:(3)符合 ...