文档章节

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

chinaran
 chinaran
发布于 2017/02/27 18:51
字数 374
阅读 71
收藏 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
Linux中的线程局部存储(一)

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

follitude
2016/06/17
16
0
POSIX线程库API(全)(上)

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

follitude
2016/06/17
5
0
linux下生产者消费者 多线程演示程序

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

西昆仑
2012/06/06
0
0
Head First C 第十二章 线程 平行世界

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

AlexTuan
2016/04/27
44
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows小技巧 – Win+R提高Windows使用效率

追求效率的朋友都需要一款顺手的快速启动工具,Win 平台上有键盘流的RunZ、Listary、ALTRun、Launchy、Wox 和图标流的 Fences、Rolan、 WinLaunch 等,而 Mac 上也有 Alfred、Spotlight。 而...

QQZZFT
1分钟前
0
0
Android 移植ffmpeg报错:"atof" referenced by "libavformat.so"

cannot locate symbol "atof" referenced by "libavformat-57.so"... 原因:android的stdlib.h中atof是内联的, 外部模块不能直接使用。跟android版本有关。 解决办法:将所有的atof改成str...

她叫我小渝
15分钟前
0
0
Java并发编程:volatile关键字解析

volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生...

engeue
32分钟前
1
0
php-fpm配置文件详解

第一部分:FPM 配置 参数          | 说明 -p            | 命令行中动态修改--prefix   ;include=etc/fpm.d/*.conf  | 用于包含一个或多个文件,如果glob(3)存在(...

bengozhong
33分钟前
1
0
Django允许外部ip访问

1、关闭防火墙 service iptables stop 2、设置django 开启django时,使用0.0.0.0:xxxx,作为ip和端口例如: python manage.py runserver 0.0.0.0:8000 3、在settings里修改ALLOWED_HOSTS = [......

MichaelShu
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部