按照书上写的,不知道为什么有问题:

//已解决,参考最新的blog,哈哈

#include <stdlib.h>
#include <pthread.h>
#include <stdio.h>
#include <unistd.h> struct foo
{
int f_count;
pthread_mutex_t f_lock;
};
struct foo* AllocFoo()
{
foo* lpFoo = (foo*)malloc(sizeof(struct foo));
if(NULL != lpFoo)
{
lpFoo->f_count = 1;
if(0 != pthread_mutex_init(&lpFoo->f_lock,NULL))
{
printf("pthread_mutex_init error.\n");
free(lpFoo);
return NULL;
}
}
printf("Alloc a Foo.\n");
return lpFoo;
} bool DestoryFoo(foo* apFoo)
{
pthread_mutex_lock(&apFoo->f_lock);
if(--apFoo->f_count == 0)
{
printf("Now f_coount:%d.\n",apFoo->f_count);
pthread_mutex_unlock(&apFoo->f_lock);
pthread_mutex_destroy(&apFoo->f_lock);
free(apFoo);
printf("Destroy foo.\n");
return true;
}
else
{
printf("Now f_coount:%d.\n",apFoo->f_count);
pthread_mutex_unlock(&apFoo->f_lock);
return false;
}
} void HoldFoo(foo* apFoo)
{
pthread_mutex_lock(&apFoo->f_lock);
++apFoo->f_count;
printf("Now f_coount:%d.\n",apFoo->f_count);
pthread_mutex_unlock(&apFoo->f_lock);
} void PrintTids(const char* s); void* ThreadFun(void* Arg)
{
PrintTids("");
foo* lpFoo = (foo*)Arg;
for(int i=0;i<5;++i)
{
HoldFoo(lpFoo);
}
}
void PrintTids(const char* s)
{
pid_t lPid = getpid();
pthread_t lTid = pthread_self();
printf("%s pid:%u,tid:%u (0x%x).\n",s,(unsigned int)lPid
, (unsigned int)lTid,(unsigned int)lTid);
}
int main()
{
foo* lpFoo = AllocFoo();
pthread_t lTid = 0;
int lErr = pthread_create(&lTid,NULL,ThreadFun,NULL);
if(0 != lErr)
{
exit(1);
}
printf("main thread");
//HoldFoo(lpFoo);
bool lIsDestory = false;
do
{
lIsDestory = DestoryFoo(lpFoo);
}while(!lIsDestory);
}

  

linux线程学习的更多相关文章

  1. Linux线程学习(一)

    一.Linux进程与线程概述 进程与线程 为什么对于大多数合作性任务,多线程比多个独立的进程更优越呢?这是因为,线程共享相同的内存空间.不同的线程可以存取内存中的同一个变量.所以,程序中的所有线程都可 ...

  2. Linux线程学习(二)

    线程基础 进程 系统中程序执行和资源分配的基本单位 每个进程有自己的数据段.代码段和堆栈段 在进行切换时需要有比较复杂的上下文切换   线程 减少处理机的空转时间,支持多处理器以及减少上下文切换开销, ...

  3. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序                                         周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...

  4. Linux线程互斥学习笔记--详细分析

    一.互斥锁 为啥要有互斥? 多个进程/线程执行的先后顺序不确定,何时切出CPU也不确定. 多个进程/线程访问变量的动作往往不是原子的. 1. 操作步骤 (1)创建锁 // 创建互斥锁mutex pth ...

  5. Dubbo入门到精通学习笔记(十一):Dubbo服务启动依赖检查、Dubbo负载均衡策略、Dubbo线程模型(结合Linux线程数限制配置的实战分享)

    文章目录 Dubbo服务启动依赖检查 Dubbo负载均衡策略 Dubbo线程模型(结合Linux线程数限制配置的实战分享) 实战经验分享( ** 属用性能调优**): Dubbo服务启动依赖检查 Du ...

  6. Linux内核学习笔记-2.进程管理

    原创文章,转载请注明:Linux内核学习笔记-2.进程管理) By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  7. Linux内核学习笔记-1.简介和入门

    原创文章,转载请注明:Linux内核学习笔记-1.简介和入门 By Lucio.Yang 部分内容来自:Linux Kernel Development(Third Edition),Robert L ...

  8. Linux kernel学习-内存管理【转】

    转自:https://zohead.com/archives/linux-kernel-learning-memory-management/ 本文同步自(如浏览不正常请点击跳转):https://z ...

  9. Linux内核分析——Linux内核学习总结

    马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 Linux内核学习总结 一 ...

随机推荐

  1. 学 Win32 汇编[34] - 宏汇编(1)

    从接触 C 语言时, 我就不大喜欢宏; 但为了看懂别人的代码也不得不去了解. 宏可定义在源程序的任意位置, 但一般放在 .data 前面.有些简单的宏可以用 equ.textequ 或 = 来代替, ...

  2. Android -- 在xml文件中定义drawable数组

    Xml <string-array name="images"> <item>@drawable/image1</item> <item& ...

  3. 推荐系统resys小组线下活动见闻2009-08-22

    http://www.tuicool.com/articles/vUvQVn 时间2009-08-30 15:13:22  不周山原文  http://www.wentrue.net/blog/?p= ...

  4. 四轴自适应控制算法的一些尝试开源我的山猫飞控和梯度在线辨识自适应等算法—(转)

    本文的最主要目的在于抛砖引玉,阿莫论坛真的是非常好的一个论坛,没有这个论坛,没有那么多这个论坛上的前人无私的奉献和热烈的讨论,我想我是怎么也无法入门四轴的控制的.只是论坛上已经很多年都没有看到过新东西 ...

  5. PHP 使用PHPExcel删除Excel单元格指定列

    需求是这样的: 有一个系统仅公司内部和外部经销商使用,在一个导出功能中公司内部员工跟外部经销商导出的列是不一样的(某些数据是不能提供给经销商的) 因为导出的数据都是一样的(某些列外数据外部没有)因此并 ...

  6. Flask的集中控制

    想通过一个统一的机制,同时允许一些公共的逻辑 {% if args["NoUser"] %} 无用户! {% else %} <!DOCTYPE html PUBLIC &q ...

  7. Docker: 如何将node.js的项目部署到docker的swarm上面去

    前提条件: Docker创建虚机和swarm 如何用Docker建立一个Node.js的开发环境 正文: 将如何用Docker建立一个Node.js的开发环境文中创建的nodehello image发 ...

  8. ExtMail telnet 25端口号 不通

    搭建好的Mail服务器在本地端口号25是开的,但是在别的电脑上就连不上. 修改/etc/postfix/main.cf文件,将 inet_interfaces = localhost 注释掉即可.

  9. Puppetmaster高可用和可扩展的方案设计

    Puppet是当前devops中常用于管理系统配置和应用部署,多数会使用其C/S架构的方式来进行部署,其中puppetmaster是集群中配置管理的核心节点.在实际的生产环境中,如果因为master节 ...

  10. 2012年5月阿里巴巴集团”去 IOE”运动的思考与总结【转载+整理】

    原文地址 什么是 IOE,IOE 只是一个简称,分别代表 IBM.Oracle.EMC,确切地说是 IBM 小型机.Oracle 数据库与 EMC 存储设备的组合.这"三驾马车"构 ...