pthread 学习系列 case1

 1 #include <stdio.h>
 2 #include <unistd.h>
 3 #include <stdlib.h>
 4 #include <pthread.h>
 5
 6
 7 void *thread_foo_func(void *);
 8 void *thread_bar_func(void *);
 9
10
11 int global = 4;
12
13
14 int main(){
15   int local = 8;
16   int foo, bar;
17   pthread_t fthread, bthread;
18   foo = pthread_create(&fthread, NULL, thread_foo_func, (void *)&local);
19   bar = pthread_create(&bthread, NULL, thread_bar_func, (void *)&local);
20   if (foo != 0 || bar != 0){
21     printf("thread creation failed.\n");
22     return -1;
23   }
24
25
26   foo = pthread_join(fthread, NULL);
27   bar = pthread_join(bthread, NULL);
28   if (foo != 0 || bar != 0){
29     printf("thread join failed.\n");
30     return -2;
31   }
32
33
34   printf("In thread main");
35   printf("address of global %d: %x\n", global, &global);
36   printf("address of main local %d: %x\n", local, &local);
37
38   return 0;
39 }
40
41
42 void *thread_foo_func(void *arg){
43   int foo_local = 16;
44   global  ++;
45   *(int *)arg = 10;
46   printf("In thread foo_func");
47   printf("address of global %d: %x\n", global, &global);
48   printf("address of main local %d: %x\n", *(int *)arg, arg);
49   printf("address of foo local: %x\n", &foo_local);
50   printf("\n");
51 }
52
53
54 void *thread_bar_func(void *arg){
55   int bar_local = 32;
56   global  ++;
57   *(int *)arg = 20;
58   printf("In thread bar_func");
59   printf("address of global %d: %x\n", global, &global);
60   printf("address of main local %d: %x\n", *(int *)arg, arg);
61   printf("address of bar local: %x\n", &bar_local);
62   printf("\n");
63 }

打印输出结果

In thread foo_funcaddress of global 5: 8049a48
address of main local 10: bfc567b8
address of foo local: b7f553c4

In thread bar_funcaddress of global 6: 8049a48
address of main local 20: bfc567b8
address of bar local: b75543c4

In thread mainaddress of global 6: 8049a48
address of main local 20: bfc567b8

可见:

1 global 在线程中可见,而且共享,

2 main中的loca通过指针传给了进程,进程可以改变

3 两个线程中的私有变量是不同的,是线程私有的。

这和fork出的进程就完全不同

 1 int global = 6;
 2
 3 int main(int argc,char** argv)
 4 {
 5     int var=10;
 6     int pid=fork();
 7     if(pid==-1){
 8         printf("error!");
 9     }
10     else if(pid==0){
11         global++;
12         var++;
13         printf("This is the child process!\n");
14     }
15     else{
16         printf("This is the parent process! child processid=%d\n",pid);
17     }
18     printf("%d, %d, %d \n", getpid(), global, var);
19
20     return 1;
21 }

打印结果:

This is the child process!
10769, 7, 11
This is the parent process! child processid=10769
10768, 6, 10 

可见,调用fork,会有两次返回,一次是父进程、一次是子进程,因为子进程是父进程的副本,所以它拥有父进程数据空间、栈和堆的副本,它们并没有共享这些存储空间,它们只共享正文段。

pthread 学习系列 case1

时间: 2024-10-13 11:55:05

pthread 学习系列 case1的相关文章

pthread 学习系列 case2-- pthread_mutex_t

许多互斥对象 如果放置了过多的互斥对象,代码就没有什么并发性可言,运行起来也比单线程解决方案慢.如果放置了过少的互斥对象,代码将出现奇怪和令人尴尬的错误.幸运的是,有一个中间立场.首先,互斥对象是用于串行化存取*共享数据*.不要对非共享数据使用互斥对象,并且,如果程序逻辑确保任何时候都只有一个线程能存取特定数据结构,那么也不要使用互斥对象. 其次,如果要使用共享数据,那么在读.写共享数据时都应使用互斥对象.用 pthread_mutex_lock() 和 pthread_mutex_unlock

Android学习系列(17)--App列表之圆角ListView(续)

http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)--App列表之圆角ListView中的,但是若是如此就让大家错过一篇新的好的文章,着实可惜.上篇中我们使用shape,corners,gradient实现了一个渐变的圆角效果,但是在完文之后的实践中,我发现有时效果不甚满意,选中和放手的事件监听没有去正确的判断,然后渐变效果也比较单一,性能也觉得不是很快

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

Caffe学习系列——工具篇:神经网络模型结构可视化

Caffe学习系列--工具篇:神经网络模型结构可视化 在Caffe中,目前有两种可视化prototxt格式网络结构的方法: 使用Netscope在线可视化 使用Caffe提供的draw_net.py 本文将就这两种方法加以介绍 1. Netscope:支持Caffe的神经网络结构在线可视化工具 Netscope是个支持prototxt格式描述的神经网络结构的在线可视工具,网址:  http://ethereon.github.io/netscope/quickstart.html  它可以用来可

Intelli IDEA学习系列之快捷键篇

Intelli IDEA学习系列之快捷键篇 IDEA简介: IDEA 全称IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE支持.Ant.JUnit.CVS整合.代码审查. 创新的GUI设计等方面的功能可以说是超常的.IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主. 在学习过程中会慢慢补充..... [1.查找] 1

Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这部分内容需要以下Jar包支持 mysql-connector:MySQL数据库连接驱动,架起服务端与数据库沟通的桥梁: MyBatis:一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架: log4j:Apache的开源项目,一个功能强大的日志组件,提供方便的日志记录: 修改后的pom.xm

Oracle学习系列4

Oracle学习系列4 ************************************************************************************ 数据库更新操作: 分类: 查询操作:select 更新操作:insert ,update , delete 为了保存原始的emp表的信息,在进行增删改之前备份词表: create table emp_bak as select * from emp ; //将表emp结构和数据完整的复制出来 添加数据:

Oracle学习系列3

Oracle学习系列3 ************************************************************************************ 多表查询: 1,SQL1999语法对多表查询的支持 2,分组统计及统计函数的使用 3,子查询,并结合多表查询,分组统计做复杂查询 4,数据库的更新操作 5,事务处理和数据库死锁 ****************************************************************

Unity-Animator学习系列总索引

花了不少时间完成了这篇Unity Animator学习系列文章,其中API部分很多都是亲测.希望能对路过的博友有所帮助 相关参考文档 Unity Animator官方组件文档 Unity Animator官方脚本文档 圣典的部分汉化文档 Animator学习系列总目录 1.Unity-Animator学习系列---API 2.Unity-Animator学习系列---控制IK 3.Unity-Animator学习系列---剪辑播放后位置预判(Animator.Target) 4.Unity-An