linux线程入门之一第一个线程函数

最适合使用线程的实现以下功能的应用:

     1 计算密集型应用,为了能在多处理器系统上运行,将这些计算分解到多个线程中实现。
    2I/O密集型应用,为提高性能,将I/O操作重叠。很多线程可以同时等待不同的I/O操作。分布式服务器应用就是很好的实例,它们必须享受多个客户的请求,必须为通过慢速的网络连接主动提供I/O做好准备。多线程通常比串行程序更快、响应性能更好,它们比实现同样功能的非线程异步程序更易于开发和维护。

线程系统的三个基本要素:执行环境、调度和同步。

    使用Pthreads,通过调用pthread_create来创建执行环境(线程)。创建一个线程同样也调度了该线程的执行,这将通过调用指定的线程创建函数开始。Pthreads允许在创建线程时指定调度参数,或在线程运行时设定,当线程调用pthread_exit时退出,或从线程函数返回时退出等。
  基本pthread同步模型使用互斥量来保护共享数据、使用条件变量来通信,还可以使用其他的同步机制,如信号量、管道和消息队列。互斥量允许线程在访问共享数据时锁定它,以避免其他线程的干扰。条件变量允许线程等待共享数据到达某个期望的状态(例如队列非空或者资源可用)。

pthread_join的应用

pthread_join使一个线程等待另一个线程结束。
代码中如果没有 pthread_join 主线程会很快结束从而使整个进程结束,从而使创建的线程没有机会开始执行就结束了。加入 pthread_join后, 主线程会一直等待直到等待的线程结束自己才结束,使创建的线程有机会执行。
所有线程都有一个线程号,也就是 Thread ID。其类型为 pthread_t。通过调用 pthread_self()函数可以获得自身的线程号。

线程终止

两种方式终止线程。

第一通过return从线程函数返回,

第二种通过调用pthread_exit()函数使线程退出。

需要注意的地方:一是,主线程中如果从main函数返回或是调用了exit函数退出主线程,则整个进程终止,此时所有的其他线程也将终止。另一种是,如果主线程调用pthread_exit函数,则仅仅是主线程消亡,进程不会结束,其他线程也不会结束,知道所有的线程都结束时,进程才结束。


线程的分离状态决定一个线程以什么样的方式来终止自己。通常采用了线程的默认属性,即为非分离状态,这种情况下,原有的线程等待创建的线程结束。只有当pthread_join()函数返回时,创建的线程才算终止,才能释放自己占用的系统资源。而分离线程不是这样子的,它没有被其他的线程所等待,自己运行结束了,线程也就终止了,马上释放系统资源。
在使用 Pthread 时避免线程的资源在线程结束时不能得到正确释放,从而避免产生潜在的内存泄漏问题, 在对待线程结束时,要确保该线程处于 detached 状态,否着就需要调用 pthread_join() 函数来对其进行资源回收。

线程属性

1 /* man pthread_attr_init */
2 typedef struct
3 {
4   int                    detachstate;    //是否与其他线程脱离同步
5   int                    schedpolicy;    //新线程的调度策略
6   struct sched_param    schedparam;        //运行优先级等
7   int                    inheritsched;    //是否继承调用者线程的值
8   int                    scope;            //线程竞争CPU的范围(优先级的范围)
9   size_t                guardsize;        //警戒堆栈的大小
10   int                    stackaddr_set;    //堆栈地址集
11   void *                stackaddr;        //堆栈地址
12   size_t                stacksize;        //堆栈大小
13 } pthread_attr_t;
属性值不能直接设置,须使用相关函数进行操作,初始化的函数为pthread_attr_init,这个函数必须在pthread_create函数之前调用。


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

void thread(void)
{
	int i;
	for(i = 0; i < 4; i++)
		printf("This is a pthread.\n"), sleep(1);
}
int main(void)
{
	pthread_t id;
	int i, ret;
	ret = pthread_create(&id, NULL, (void*)thread, NULL);
	if(ret != 0) {
		printf("Create pthread error!\n");
		exit(EXIT_FAILURE);
	}
	for(i = 0; i < 3; i++)
		printf("This is the main process.\n"), sleep(1);
	pthread_join(id, NULL);
	return 0;
}
执行结果如下:


谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值