对线程的深入学习(三)

1.  线程执行轨迹

1) 同步方式(非分离状态):创建线程之后调用pthread_join函数等待其终止,并释放线程资源。
2) 异步方式(分离状态):无需创建者等待,线程终止后自行释放资源

int pthread_detach (pthread_t thread); 
       使thread参数所标识的线程进入分离(DETACHED)状态。处于分离状态的线程终止后自动释放线程资源,且不能被pthread_join函数等待
成功返回0,失败返回错误码。

// 异步方式创建子线程,也叫分离态
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>

void* thread_proc (void* arg) {
	
	int i;
	for (i = 0; i < 200; i++) {
		putchar ('-');
		usleep (50000);
	}
	return NULL;
}

int main (void) {
	setbuf (stdout, NULL);//关闭缓冲区

	pthread_t tid;
	int error = pthread_create (&tid, NULL, thread_proc, NULL);
	if (error) {
		fprintf (stderr, "pthread_create: %s\n", strerror (error));
		return -1;
	}

	if ((error = pthread_detach (tid)) != 0) { //如果没有这个函数,子线资源永远不会被回收,主线程如果一直不结束,子线程的资源就会越来越多
		fprintf (stderr, "pthread_detach: %s\n", strerror (error));
		return -1;
	}
	/*
	if ((error = pthread_join (tid, NULL)) != 0) {   //用这个函数代替分离函数,会先打印200个“-”后打印200“+”
		fprintf (stderr, "pthread_join: %s\n", strerror (error));
		return -1;
	}
	*/
	int i;
	for (i = 0; i < 200; i++) {
		putchar ('+');
		usleep (100000);
	}
	printf ("\n");
	return 0;
}


2. 线程属性

int pthread_create (pthread_t* restrict thread,
    const pthread_attr_t* restrict attr,
    void* (*start_routine) (void*),
    void* restrict arg);

创建线程函数的第二个参数即为线程属性,传空指针表示使用缺省属性。

1)获取线程属性

第一步,获取线程属性结构体

int pthread_getattr_np (pthread_t thread,pthread_attr_t* attr);

第二步,获取具体线程属性项

具体函数参考点击打开链接

2) 设置线程属性

 第一步,初始化线程属性结构体

int pthread_attr_init (pthread_attr_t* attr);

第二步,设置具体线程属性项

第三步,以设置好的线程属性结构体为参数创建线程

 int pthread_create (...);

 第四步,销毁线程属性结构体

int pthread_attr_destroy (pthread_attr_t* attr);





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值