文档章节

线程创建 pthread_create 中自定义参数注意事项

chinaran
 chinaran
发布于 2017/02/27 18:51
字数 374
阅读 71
收藏 0
点赞 0
评论 0

1. 函数原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
         void *(*start_routine) (void *), void *arg);
本文主要讨论最后一个参数,同时传递多个的问题
(如果只传递一个 int char 等长度小于指针的数据类型,可以直接传,然后在线程内把 (void *) 强制转换)

2. 错误示例 是在一本书上看到的,也是写本文的初衷 线程创建错误参数传递示例

错误原因: fds_for_new_worker 是局部变量,线程创建异步的,pthread_create 后, else if 也结束了,该变量的生命周期结束,worker 线程访问到的将是野指针,容易造成数据访问错误或更严重的内存错误。

3. 正确传递方法
A. 使用全局变量(视情况使用)
 变量的作用域不会消失,但要注意多线程变量同步问题
B. 动态分配变量空间(推荐)
 在 pthread_create 前 malloc() 申请空间,在线程内使用完后 free()

附:错误代码验证

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

struct data_st
{
	int a;
	int b;
};

static void *start_routine(void *user)
{
	// sleep(1);
	struct data_st *data = (struct data_st *)user;
	printf("in thread, data->a = %d, data->b = %d\n", data->a, data->b);

	pthread_detach(pthread_self());
	return NULL;
}

int main(void)
{
	int i;
	int ret;
	pthread_t pt;

	for (i = 0; i < 5; ++i)
	{
		struct data_st data;
		data.a = i;
		data.b = i * 2;

		ret = pthread_create(&pt, NULL, start_routine, &data);
		if (0 != ret)
		{
			printf("%s(): Thread creation failed\n", __FUNCTION__);
			exit(EXIT_FAILURE);
		}
	}

	pause();
	
	return 0;
}

运行结果:

运行结果

可以看出,这种错误的传递方式并没有得到应有的结果

© 著作权归作者所有

共有 人打赏支持
chinaran
粉丝 6
博文 6
码字总数 3019
作品 0
海淀
程序员
对线程的一点理解

线程的创建即意味着该线程会去执行其特定的任务,当然线程在创建过程中可能会失败,若程序代码没有码错,一般会出现两种错误,一:出现EAGIN即系统限制创建线程,可能原因:线程过多,二:出现...

zuolin ⋅ 2012/06/07 ⋅ 0

Linux多线程编程 二

/ 演示linux线程的基本操作 / #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #define DEBUG #ifdef DEBUG #define DBG(fmt,args...) fprintf(stdout, ......

wannneg ⋅ 2016/04/16 ⋅ 0

Linux中的线程局部存储(一)

在 Linux系统中使用C/C++进行多线程编程时,我们遇到最多的就是对同一变量的多线程读写问题,大多情况下遇到这类问题都是通过锁机制来处理,但这对 程序的性能带来了很大的影响,当然对于那些...

follitude ⋅ 2016/06/17 ⋅ 0

POSIX线程库API(全)(上)

线程库 下面简要论述了特定任务及其相关手册页。 创建缺省线程 如果未指定属性对象,则该对象为 NULL,系统会创建具有以下属性的缺省线程: 进程范围 非分离 缺省栈和缺省栈大小 零优先级 还...

follitude ⋅ 2016/06/17 ⋅ 0

linux下生产者消费者 多线程演示程序

基本API介绍 线程 线程创建: int pthreadcreate(pthread *thread, pthreadattrt attr, void (*startroutine)(void), void arg); 第一个参数为指向线程 第二个参数用来设置线程属性。 第三个参...

西昆仑 ⋅ 2012/06/06 ⋅ 0

Head First C 第十二章 线程 平行世界

Head First C 第十二章 线程 平行世界 前面我们已经会用多进程的方式,来让计算机同时做多件事,但是进程还有以下几个缺点: 创建进程要花时间 有的机器创建进程只需要花一丁点时间,虽然时间...

AlexTuan ⋅ 2016/04/27 ⋅ 0

关于线程的私有存储pthread_key_t

最近在工作中遇到了线程的私有存储的东东,现将对pthreadkeyt的认识与大家分享一下: 熟悉linux线程开发的人都清楚,一个进程中线程直接除了线程自己的栈和寄存器之外,其他几乎都是共享的,...

老叮当猫 ⋅ 2013/06/12 ⋅ 0

linux多线程学习(一)---线程基础

一.什么是线程 在一个程序里的多个执行路线就叫做线程。更准确的定义是:线程是“一个进程内部的一个控制序列”。 典型的unix进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情...

长平狐 ⋅ 2012/09/03 ⋅ 0

pthread_key_t和pthread_key_create()的使用

pthreadkeyt和pthreadkeycreate()的使用 2011-07-20 10:18:23 转自网络:广告童装批发 下面说一下线程中特有的线程存储, Thread Specific Data 。线程存储有什么用了?他是什么意思了?大家...

LiSteven ⋅ 2013/03/31 ⋅ 0

pthread_attr_init线程属性

1.线程属性 线程具有属性,用pthreadattrt表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。我们用pthreadattrinit函数对其初始化,用pthreadattrdestroy对其去除...

bfajs12 ⋅ 2014/06/30 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 51分钟前 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 今天 ⋅ 0

如何将S/4HANA系统存储的图片文件用Java程序保存到本地

我在S/4HANA的事务码MM02里为Material维护图片文件作为附件: 通过如下简单的ABAP代码即可将图片文件的二进制内容读取出来: REPORT zgos_api.DATA ls_appl_object TYPE gos_s_obj.DA...

JerryWang_SAP ⋅ 今天 ⋅ 0

云计算的选择悖论如何对待?

导读 人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云...

问题终结者 ⋅ 今天 ⋅ 0

637. Average of Levels in Binary Tree - LeetCode

Question 637. Average of Levels in Binary Tree Solution 思路:定义一个map,层数作为key,value保存每层的元素个数和所有元素的和,遍历这个树,把map里面填值,遍历结束后,再遍历这个map,把每...

yysue ⋅ 今天 ⋅ 0

IDEA配置和使用

版本控制 svn IDEA版本控制工具不能使用 VCS-->Enable Version Control Integration File-->Settings-->Plugins 搜索Subversion,勾选SVN和Git插件 删除.idea文件夹重新生成项目 安装SVN客户......

bithup ⋅ 今天 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部