Linux 线程学习及示例

头文件:#include <pthread.h>
一、pthread_create 函数
原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
功能:创建线程
参数:
thread:指向线程标识符的指针。
attr:线程属性
start_routine:线程运行函数地址
arg:运行函数的参数
返回值:
0:成功
非0:失败

注:
1)pthread_t定义:
typedef unsigned long int pthread_t;

二、pthread_join函数
原型:int pthread_join(pthread_t thread, void **retval);
功能:等待指定线程的结束,回收资源
参数:
thread:被等待的线程标识符
retval:为一个用户定义的指针,它可以用来存储被等待线程的返回值
返回值:
0:成功
非0:失败

三、pthread_attr_init函数
原型:int pthread_attr_init(pthread_attr_t *attr);
功能:初始化一个线程属性对象
参数:
attr:线程属性结构体指针
返回值:
0:成功
非0:失败

四、pthread_attr_destroy函数
原型:int pthread_attr_destroy(pthread_attr_t *attr);
功能:销毁一个线程属性对象
参数:
attr:线程属性结构体指针
返回值:
0:成功
非0:失败

注:
1)pthread_attr_t 结构体说明:
typedef struct
{
int detachstate; // 线程的分离状态
int schedpolicy; // 线程调度策略
structsched_param schedparam; // 线程的调度参数
int inheritsched; // 线程的继承性
int scope; // 线程的作用域
size_t guardsize; // 线程栈末尾的警戒缓冲区大小
int stackaddr_set; // 线程的栈设置
void* stackaddr; // 线程栈的位置
size_t stacksize; // 线程栈的大小
} pthread_attr_t;
2)线程具有属性,用pthread_attr_t表示,在对该结构进行处理之前必须进行初始化,在使用后需要对其去除初始化。
调用pthread_attr_init之后,pthread_t结构所包含的内容就是操作系统实现支持的线程所有属性的默认值。

五、pthread_exit函数
原型:void pthread_exit(void *retval);
功能:退出线程
参数:
retval:函数的返回代码

六、pthread_attr_getdetachstate函数
原型:int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
功能:设置线程分离状态属性
参数:
attr:线程属性结构体指针
detachstate:分离属性值
返回值:
0:成功
非0:失败

七、pthread_attr_getdetachstate函数
原型:int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
功能:获取线程的分离状态属性
参数:
attr:线程属性结构体指针
detachstate:分离属性值
返回值:
0:成功
非0:失败

注:
PTHREAD_CREATE_DETACHED(1):设置分离状态
PTHREAD_CREATE_JOINABLE(0):设置正常状态

八、pthread_self函数
原型:pthread_t pthread_self(void);
功能:获取线程ID

示例代码:
测试1:pthread_join 阻塞等待指定线程结束

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

struct member{
	int num;
	char *name;
};

void *pthread(void *arg)
{
	struct member *temp;
	printf("pthread start!\n");
	
	sleep(2);
	
	temp = (struct member *)arg;
	printf("member->num: %d\n", temp->num);
	printf("member->namme: %s\n", temp->name);
	
	return NULL;
}


int main(int argc, char *argv[])
{
	pthread_t tidp;
	struct member *b;
	
	b = (struct member *) malloc(sizeof(struct member));
	b->num = 1;
	b->name = "hello world";
	
	if ((pthread_create(&tidp, NULL, pthread, (void *)b)) == -1) {
		printf(" create error!\n");
		return 1;
	}

	
	if (pthread_join(tidp, NULL)) {
		printf("thread is not exit...\n");
		return -2;
	}

	printf("Exit main thread\n");
	return 0;
}

执行结果:
pthread start!
member->num: 1
member->namme: hello world
Exit main thread

测试2:

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

struct member{
	int len;
	char *data
};

void *func(void *arg)
{
	struct member *memData = (struct member *)arg;
	printf("data len is %d, data is %s\n",memData->len,memData->data);	
	sleep(10);
	printf("thread id =%ld\n", pthread_self());
	printf("pthread end\n");	
}


void main(void)
{
	pthread_attr_t attr;
	pthread_t pthread;
	struct member argMem = {10, "helloworld"};

	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr, 1);
	//pthread_attr_setdetachstate(&attr, 0);
	
	pthread_create(&pthread, &attr, func, (void *)&argMem);	
	pthread_attr_destroy(&attr);	
	sleep(2);
//	pthread_cancel(pthread);
	printf("end\n");
	pthread_join(pthread,NULL);
	
	return ;	
}

注:
1)如果设置成PTHREAD_CREATE_DETACHED状态,则pthread_join不会去阻塞等待指定线程结束,
只有设置成PTHREAD_CREATE_JOINABLE,pthread_join才生效
2)如果在pthread_join之前设置pthread_cancel,那么pthread_join也不会起作用
3)pthread_self 方式获取线程id:pthread_self返回的是posix定义的线程ID
thread id =140557187577600

测试3:

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

void *func(void *arg)
{
	printf("%s: %s\n", __func__, (char *)arg);		
}

void *func2(void *arg)
{
	printf("%s: %s\n", __func__, (char *)arg);		
}

void *func3(void *arg)
{
	printf("%s: %s\n", __func__, (char *)arg);		
}

void main(void)
{
	pthread_t t1, t2, t3;
	pthread_attr_t attr;		
	int val;
	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr, 0);
	
	pthread_create(&t1, &attr, func, (void *)"hello this is thread1");	
	pthread_join(t1, NULL);
	pthread_create(&t2, &attr, func2, (void *)"hello this is thread2");	
	pthread_join(t2, NULL);
	pthread_attr_getdetachstate(&attr, &val);
    printf("%d\n",val);

	pthread_create(&t3, &attr, func3, (void *)"hello this is thread3");	
	
	pthread_attr_destroy(&attr);
	pthread_join(t3, NULL);
	printf("hello world\n");
	
}

测试结果:
func: hello this is thread1
func2: hello this is thread2
0
func3: hello this is thread3
hello world

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值