文档章节

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

chinaran
 chinaran
发布于 2017/02/27 18:51
字数 374
阅读 74
收藏 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
海淀
程序员
私信 提问
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
49
0
Head First C 第十二章 线程 平行世界

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

AlexTuan
2016/04/27
44
0
POSIX线程库API(全)(上)

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

follitude
2016/06/17
5
0
Linux中的线程局部存储(一)

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

follitude
2016/06/17
16
0
[原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)

本文可任意转载,但必须注明作者和出处。 【原创】手把手教你Linux下的多线程设计(一) --Linux下多线程编程详解 原创作者:Frozen_socker(冰棍) E_mail:dlskyfly@163.com 线程也被称为轻权...

gaoshouma
2007/07/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Supervisor管理springboot应用

目录 概述 环境准备 spring boot应用 supervisor配置 启动应用 概述 前面博文介绍了Supervisor进程管理,实际应用可以对springboot应用进行管理,如果springboot应用挂掉,Supervisor还可以对它...

java_龙
3分钟前
0
0
将神经网络训练成一个“放大镜”

摘要: 想不想将神经网络训练成一个“放大镜”?我们就训练了一个这样炫酷的神经网络,点击文章一起看下吧! 低分辨率蝴蝶的放大 当我们网购时,我们肯定希望有一个贴近现实的购物体验,也就...

阿里云官方博客
3分钟前
0
0
在细节消息中包含能够捕获失败的信息(63)

程序由于未被捕获异常失败时,系统会自动打印该异常的堆栈轨迹 包含异常的字符串表示法(toString) 通常包含异常的类名,以及紧随其后的细节信息(detail message) 是检查程序失败的必须信...

Java搬砖工程师
4分钟前
0
0
day173-2018-12-10-英语流利阅读-待学习

如何评价特朗普在此次 G20 上的表现? 毛西 2018-12-10 1.今日导读 在公众眼里,特朗普一直是个不省事的主——他爱在推特吐槽,还喜欢到处树敌。但最近,阿根廷首都布宜诺斯艾利斯举行的 G2...

飞鱼说编程
6分钟前
1
0
adr adrl ldr mov简单科普

ADR是一条小范围的地址读取伪指令,它将基于PC的相对偏移的地址值读到目标寄存器中。格式:ADR register,exper。 编译源程序时,汇编器首先计算当前PC值(当前指令位置)到exper的距离,然后用...

天王盖地虎626
12分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部