linux——09线程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

前言

提示:以下是本篇文章正文内容,下面案例可供参考

一、线程是什么?

线程依赖于进程,位与进程空间内部
线程是一个轻量级的进程。
线程是cpu任务调度的的最小单元。
进程是操作系统资源分配的最小单元

	进程和线程的区别
	1.线程轻量,切换调度任务时效率更高
	2.进程空间独立,切换调度任务时资源开销较大
	3.进程通讯复杂,不会引发资源竞争
	4.线程通讯简单,会引发资源竞争

二、使用步骤

1.创建、退出、回收

进程创建:0-4g虚拟内存空间——包括文本段、数据段、系统数据段
线程创建:栈空间独立,其余空间均与所在进程保持一致。
代码如下(示例):

	1.创建
	int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);
     功能:
     在调用该函数的进程中创建一个线程 
     参数:
     thread:将线程ID放入thread指向的空间中
     attr:线程属性
     start_routine:线程函数入口
     arg:线程函数的参数
     返回值
     成功返回0
     失败返回错误码
     
	2.退出
	void pthread_exit(void *retval);
	 功能:
	 	退出线程
     参数:
     	retval线程结束的值
     返回值:
     	缺省
	3.回收
	int pthread_join(pthread_t thread, void **retval)
	 功能:
	 	回收线程空间
     参数:
     	thread:回收线程ID
     	retval:存放线程结束值空间的首地址
     返回值:
     	成功返回0
     	失败返回错误码
     pthread_joinj具有阻塞功能
     可以实现同步
    

2.线程分离属性

	 线程分离属性:在多线程回收的问题中,会出现某个线程阻塞以至于其他线程无法进程回收
     分离属性:
     1. 将线程设定为分离属性,当线程结束自己回收线程空间
     缺点:
     1.是无法实现线程的同步
     2.无法回收线程结束的状态
     4.线程
     int pthread_attr_init(pthread_attr_t *attr);
     功能:
     	线程属性初始化
     参数:
     	attr:线程属性空间首地址
     返回值:
     	成功返回0
     	失败返回非0
     int pthread_attr_destroy(pthread_attr_t *attr);
	 功能:
	 	线程属性销毁
     参数:
     	attr:线程属性空间首地址
     返回值:
     	成功返回0
     	失败返回非0
      int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
      功能:
      	设置线程回收属性
      参数:
      attr:线程属性空间首地址
      detachstate:
      	PTHREAD_CREATE_DETACHED
      	分离属性(线程结束自动回收线程空间)
      	PTHREAD_CREATE_DETACHED
      	阻塞属性(线程结束手动回收线程空间)
      返回值
      	成功返回0
      	失败返回非0 

2.多线程任务——生产者消费者模型

#include "head.h"
//模拟队列
typedef struct queue
{
	char name[100][32];
	int head;
	int tail;
	pthread_mutex_t lock;
}queue_t;
//创建队列
queue_t seqqueue;
//创建信号量
sem_t table;
//线程1 将客户信息存储队列
void* paidui(void*arg)
{
	char buf[1024] = {0};
	while(1)
	{
		gets(buf);
		strcpy(seqqueue.name[seqqueue.tail],buf);
		seqqueue.tail++;
	}

	return NULL;
}
//线程3 模拟吃饭过程
void *eat(void*arg)
{
	char *name = arg;
	printf("%s is eating...\n",name);

	srand(time(NULL));
	sleep(rand() % 10 + 1);
	printf("%s is eating...over\n",name);
	sem_post(&table);

	return NULL;

}
//线程2 接待顾客 并创建第三个线程
void *wait(void*arg)
{

	pthread_t tid3;
	while(1)
	{
		pthread_mutex_lock(&seqqueue.lock);
		sem_wait(&table);
		if(seqqueue.tail == seqqueue.head)
		{
			sem_post(&table);
		}
		else
		{
			pthread_create(&tid3,NULL,eat,seqqueue.name[seqqueue.head]);
			seqqueue.head++;
		}
		pthread_mutex_unlock(&seqqueue.lock);
	}
}

int main(int argc, const char *argv[])
{
	pthread_t tid1;
	pthread_t tid2;
	int i = 0;
	//初始化
	pthread_mutex_init(&seqqueue.lock,NULL);
	sem_init(&table,0,3);
	//创建线程
	pthread_create(&tid1,NULL,paidui,NULL);
	pthread_create(&tid2,NULL,wait,NULL);
	//回收线程
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
	//销毁信号量和互斥锁
	pthread_mutex_destroy(&seqqueue.lock);
	sem_destroy(&table);
	return 0;
}

总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值