提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、线程是什么?
线程依赖于进程,位与进程空间内部
线程是一个轻量级的进程。
线程是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提供了大量能使我们快速便捷地处理数据的函数和方法。