线程相关函数讲解

本文介绍了Linux环境下线程的创建、等待及分离等基本操作,并通过示例代码详细展示了如何使用pthread库函数进行线程管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      我们都知道,Linux 中的线程其实就是进程,只是线程共享进程的地址空间,其他的没有什么特别,线程也具有进程描述符,内核栈,thread_info 结构等等,进程所具有的东西。

      创建线程我们需要用到的函数是 pthread_create,线程和进程一样,需要进程进行等待,以释放线程占用的其他资源,哈哈,这又和进程的实现是一样的,主线程等待子线程的函数是 pthread_join,好吧,下面我们看一段代码吧。

/*
 * dlut_pthread.c
 *
 *  Created on: 2014年1月9日
 *      Author: DLUTBruceZhang
 */


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

#define THREAD_COUNT		2

void 		dlut_print_thread_id();
void * 	dlut_thread_func(void *arg);

int main(int argc, char **argv, char **environ)
{
	int i = 0;

	pthread_t tid[THREAD_COUNT];

	void *status;

	for (i = 0; i != THREAD_COUNT; i++)
	{
		pthread_create((pthread_t *)&tid[i], NULL, dlut_thread_func, (void *)"BruceZhang");
	}

	pthread_join(tid[0], &status);
	pthread_join(tid[1], &status);

	return 0;
}

void dlut_print_thread_id(char *s)
{
	pthread_t tid;

	tid = pthread_self();

	printf("%s : this new thread's id is %d\n", s, (int)tid);
	
	sleep(3);

	return;
}

void * dlut_thread_func(void *arg)
{
	dlut_print_thread_id((char *)arg);

	return (void *)0;
}

      运行程序,我们发现,主线程需要等待三秒才结束,如果没有等待的话,那么进程会直接结束,不过,通常我们不这样做,我们一般不想等待子线程的话(因为这样会阻塞主线程),在web服务器中这一点相当重要,因为,主线程需要做一些其他的工作,这时,我们需要做的就是分离子线程,这时我们用到的函数是 pthread_detach,它的作用就是不用这个主线程去回收资源,而是子线程结束之后自行释放它的资源,下面我们来看下它的实现方法:

/*
 * dlut_pthread.c
 *
 *  Created on: 2014年1月9日
 *      Author: DLUTBruceZhang
 */


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

#define THREAD_COUNT		2

void 		dlut_print_thread_id();
void * 	dlut_thread_func(void *arg);

int main(int argc, char **argv, char **environ)
{
	int i = 0;

	pthread_t tid[THREAD_COUNT];

	void *status;

	for (i = 0; i != THREAD_COUNT; i++)
	{
		pthread_create((pthread_t *)&tid[i], NULL, dlut_thread_func, (void *)"BruceZhang");
	}

	for (i = 0; i != THREAD_COUNT; i++)
	{
		pthread_detach(tid[i]);
	}
	
	sleep(1);

	return 0;
}

void dlut_print_thread_id(char *s)
{
	pthread_t tid;

	tid = pthread_self();

	printf("%s : this new thread's id is %d\n", s, (int)tid);
	

	return;
}

void * dlut_thread_func(void *arg)
{
	dlut_print_thread_id((char *)arg);

	return (void *)0;
}

      这时,就是分离的子线程自行工作,自行释放资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值