【linux高级程序设计】(第十二章)Linux多线程编程 2

线程同步机制

互斥锁通信机制

int pthread_mutex_init (pthread_mutex_t *__mutex, __const pthread_mutexattr_t *__mutexattr) :初始化互斥锁,成功返回0

  参数1:要初始化的互斥锁

  参数2:定义要初始化的互斥锁属性,NULL表默认

PTHREAD_MUTEX_INITIALIZER 初始化静态分配互斥锁   ??这个语法是什么原理???

#define PTHREAD_MUTEX_INITIALIZER {{0,}}

初始化代码如下:

pthread_mutex_t mp = PTHREAD_MUTEX_INITIALIZER;

int pthread_mutex_destroy (pthread_mutex_t * __mutex) :销毁互斥锁,成功返回0

int pthread_mutex_lock (pthread_mutex_t *__mutex) :以阻塞方式申请互斥锁

int pthread_mutex_trylock (pthread_mutex_t *__mutex) :以非阻塞方式申请互斥锁

int pthread_mutex_unlock (pthread_mutex_t *__mutex) :释放互斥锁

例子:实现读写线程,读时不写,写时不读(我说不清楚下面的代码好不好,因为代码里面循环测试锁,跟我想象的不同,而且是写一句,读一句的。我觉得应该是可以任意写,读按顺序读)

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>
#include<string.h>
void *thread_function (void *arg);
//全局互斥锁对象
pthread_mutex_t work_mutex;
#define WORK_SIZE 1024
//全局共享数据区
char work_area[WORK_SIZE];
int time_to_exit = 0;
int main(int argc, char *argv[])
{
    int res;
    pthread_t a_thread;
    void *thread_result;
    //初始化互斥锁
    res = pthread_mutex_init(&work_mutex, NULL);
    if(res != 0)
    {
        printf("Mutex initialization failed");
        exit(EXIT_FAILURE);
    }
    //创建新线程
    res = pthread_create(&a_thread, NULL, thread_function, NULL);
    if(res != 0)
    {
        printf("Thread creation failed");
        exit(EXIT_FAILURE);
    }
    //接收输入前,给互斥锁上锁
    pthread_mutex_lock(&work_mutex);
    printf("Input some text. Enter ‘end‘ to finish\n");
    while(!time_to_exit)
    {
        fgets(work_area, WORK_SIZE, stdin);
        //解锁
        pthread_mutex_unlock(&work_mutex);
        while(1)
        {
            //上锁
            pthread_mutex_lock(&work_mutex);
            if(work_area[0] != ‘\0‘)  //检测数据是否读出
            {
                pthread_mutex_unlock(&work_mutex); //如果没有输出,解锁
                sleep(1);
            }
            else
            {
                break;
            }
        }
    }
    pthread_mutex_unlock(&work_mutex);  //解锁
    printf("\nWaiting for thread to finish...\n");
    res = pthread_join(a_thread, &thread_result);
    if(res != 0)
    {
        printf("Thread join failed");
        exit(EXIT_FAILURE);
    }
    printf("Thread joined\n");
    pthread_mutex_destroy(&work_mutex);
    exit(EXIT_SUCCESS);
}

void *thread_function(void *arg)
{
    sleep(1);
    //上锁,抢占资源
    pthread_mutex_lock(&work_mutex);
    while(strncmp("end", work_area, 3) != 0)
    {
        printf("You input %d characters\n", strlen(work_area));
        printf("the characters is %s", work_area);
        work_area[0] = ‘\0‘;
        pthread_mutex_unlock(&work_mutex);
        sleep(1);
        pthread_mutex_lock(&work_mutex);
        while(work_area[0] == ‘\0‘)
        {
            pthread_mutex_unlock(&work_mutex);
            sleep(1);
            pthread_mutex_lock(&work_mutex);
        }
    }
    time_to_exit = 1;
    work_area[0] = ‘\0‘;
    pthread_mutex_unlock(&work_mutex);
    pthread_exit(0);
}

时间: 2024-10-11 12:13:35

【linux高级程序设计】(第十二章)Linux多线程编程 2的相关文章

读书笔记 - js高级程序设计 - 第十二章 DOM2和DOM3

Node类型的变化   访问元素的样式 myDiv.style.backgroundColor = "red" myDiv.style.width = "100px" 计算的样式 记住所有计算的样式都是只读的 偏移量 offsetHeight 外边框外 offsetWidth offsetLeft  外边框外 到 左端 offsetTop  客户区的大小 clientWidth  内边框外缘 clientHeight 内边框外缘 滚动大小 scrollHeight

Linux与云计算——第二阶段Linux服务器架设 第一十二章:数据库搭建—PostgreSQL

Linux与云计算--第二阶段Linux服务器架设 第一十二章:数据库搭建-PostgreSQL 1.1 安装PostgreSQL [1] 安装并启动PostgreSQL. [[email protected] ~]# yum -y install postgresql-server [[email protected] ~]# postgresql-setup initdb Initializing database ... OK [[email protected] ~]# vim /var

第二十二章 Linux文件比较,文本文件的交集、差集与求差:comm命令

第二十二章 Linux文件比较,文本文件的交集.差集与求差:comm命令 名词解释 comm 命令 可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.差集操作. 交集:打印两个文件所共有的行 求差:打印出指定文件所包含的其不相同的行. 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行. 语法 comm(选项)(参数) 选项 -1 :不显示在第一个文件出现的内容: -2 :不显示在第二个文件中出现的内容: -3 :不显示同时在两个文件中都出现的内容. ? 参数

javascript高级程序设计 第十四章--表单脚本

javascript高级程序设计 第十四章--表单脚本 在HTML中表单由<form>元素表示,在js中表单对应的是HTMLFormElement类型,这个类型也有很多属性和方法:取得表单元素的引用还是为它添加id特性,用DOM操作来获取表单元素:提交表单:把<input>或<button>元素的type特性设置为"submit",图像按钮把<input>元素的type特性设置为"image",也可以调用submit(

Java学习笔记—第十二章 Java网络编程入门

第十二章  Java网络编程入门 Java提供的三大类网络功能: (1)URL和URLConnection:三大类中最高级的一种,通过URL网络资源表达方式,可以很容易确定网络上数据的位置.利用URL的表示和建立,Java程序可以直接读入网络上所放的数据,或把自己的数据传送到网络的另一端. (2)Socket:又称"套接字",用于描述IP地址和端口(在Internet中,网络中的每台主机都有一个唯一的IP地址,而每台主机又通过提供多个不同端口来提供多种服务).在客户/服务器网络中,当客

疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程java任务timerstring 2009-01-16 21:12 6722人阅读 评论(0) 收藏 举报  分类: J2SE(63)  版权声明:本文为博主原创文章,未经博主允许不得转载. 前几天讲了Swing基本的控件,今天开始讲特殊控件.一天讲2个吧,首先讲用JProgressBar,Pro

读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺乏必要的绘图驱动程序,则浏览器即使支持了也没用   <canvas> var drawing = document.getElementById("drawing"); if( drawing.getContext ){ drawing.getContext("2d"

鸟哥的Linux私房菜——第十二章:档案的压缩与打包

视频链接: 土豆: B站(推荐): 本章目录: 1. 压缩档案的用途与技术: (为啥要压缩嘞?因为比如存储一个数字1,前7位补充0浪费,压缩技术就是把空的那些用上,省硬盘空间,下载的时候也省带宽)2. Linux 系统常见的压缩指令:2.1 compress (这个是最老的压缩指令,现在不怎么用了)2.2 gzip, zcat (新一代的压缩指令,代替了compress,zcat是读取gzip和compress的压缩数据的指令)2.3 bzip2, bzcat   (bzip2更高效,压缩比高,

第十二章 linux磁盘管理-lvm(2)

yum install lvm2-2.02.72-8.el6_0.4.x86_64 1.将新创建的两个分区/dev/sdb1 /dev/sdb2转化成物理卷,主要是添加LVM属性信息并划分PE存储单元. pvcreate /dev/sdb1 /dev/sdb2 pvs pvdisplay 2.创建卷组 vgdata ,并将刚才创建好的两个物理卷加入该卷组.可以看出默认PE大小为4MB,PE是卷组的最小存储单元.可以通过 –s参数修改大小 vgcreate vgdata /dev/sdb1 /de

第十二章 &nbsp; Linux &nbsp; DNS域名解析

实验要求: n 主域名服务器地址为ns1.benet.com (173.16.16.5) n 从域名服务器地址为ns2.benet.com(173.16.16.6) n 为benet.com.accp.com区域提供以下解析记录. l Mail.benet.com(123.45.67.89).ftp.benet.com(123.45.67.90) l www.benet.com(123.45.67.88).*.benet.com(123.45.67.88) l www.accp.com (58.