做影视网站用什么网盘最好,国外招工信息最新招聘信息,哈尔滨网站建设托管公司,四川省建设人才网官网进程是资源分配的基本单位 线程是调度的基本单位 笼统来说#xff0c;线程有以下优点#xff1a; 创建一个新线程的代价要比创建一个新进程小得多 与进程之间的切换相比#xff0c;线程之间的切换需要操作系统做的工作要少很多 线程占用的资源要比进程少很多 能充分利用多… 进程是资源分配的基本单位 线程是调度的基本单位 笼统来说线程有以下优点 创建一个新线程的代价要比创建一个新进程小得多 与进程之间的切换相比线程之间的切换需要操作系统做的工作要少很多 线程占用的资源要比进程少很多 能充分利用多处理器的可并行数量 在等待慢速I/O操作结束的同时程序可执行其他的计算任务 计算密集型应用为了能在多处理器系统上运行将计算分解到多个线程中实现 I/O密集型应用为了提高性能将I/O操作重叠。线程可以同时等待不同的I/O操作。 线程的缺点也不少 性能损失 一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型 线程的数量比可用的处理器多那么可能会有较大的性能损失这里的性能损失指的是增加了额外的 同步和调度开销而可用的资源不变。 健壮性降低 编写多线程需要更全面更深入的考虑在一个多线程程序里因时间分配上的细微偏差或者因共享了不该共享的变量而造成不良影响的可能性是很大的换句话说线程之间是缺乏保护的。 缺乏访问控制 进程是访问控制的基本粒度在一个线程中调用某些 OS 函数会对整个进程造成影响。 编程难度提高 编写与调试一个多线程程序比单线程程序困难得多 所谓健壮性就是鲁棒性在多线程中任何一个线程出现崩溃的情况整个进程都跟着玩完。
而多进程代码就不会因为进程有独立性。 进程的多个线程共享同一地址空间 , 因此 Text Segment代码段 、 Data Segment数据区 都是共享的 , 如果定义一个函数 , 在各线程 中都可以调用, 如果定义一个全局变量 , 在各线程中都可以访问到。 除此之外 各线程还共享以下进程资源和环境 : 文件描述符表 每种信号的处理方式(SIG_ IGN、SIG_ DFL或者自定义的信号处理函数) 当前工作目录 用户id和组id 线程共享进程数据但也拥有自己的一部分数据 : 线程 ID 一组寄存器 栈 errno 信号屏蔽字 调度优先级 每个线程都要有自己的独立的硬件上下文也要有自己独立的栈结构。
linux没有真线程只有轻量化进程所以Linux OS只会提供轻量化进程的系统调用不会直接提供线程创建的接口。 操作系统和用户之间有一层软件层对上提供线程的相关控制接口。
然后在软件层中将线程对应成LWP。 它并不属于操作系统而是开发者封装的一个库。叫做 pthread原生线程库。
任何一款Linux系统都有这个库。 我们可以对mythread所回调的函数进行传参。
#includeiostream
#includestring
#includepthread.h
#includeunistd.h
using namespace std;
void *ThreadRoutine(void*args)
{string stringname(const char*)args;while(true){coutI am new Thread threadnamestringnameendl;sleep(1);}}
int main()
{pthread_t tid;pthread_create(tid,nullptr,ThreadRoutine,(void*)thread 1);while(true){coutI am main Threadendl;sleep(1);}
} 这个参数传什么都行。
可以像我一样直接传一个类。
#includeiostream
#includestring
#includefunctional
#includepthread.h
#includeunistd.h
#includetime.h
using namespace std;
using func_tfunctionvoid();
class ThreadData
{public:ThreadData(const stringname,const uint64_tctime,func_t f):threadname(name),createtime(ctime),func(f){}public:string threadname;uint64_t createtime;func_t func;
};
void *ThreadRoutine(void*args)
{ThreadData*tdstatic_castThreadData*(args);while(true){coutI am new Thread td-threadname td-createtime endl;td-func();sleep(1);}}
void print()
{cout我是线程执行的大任务的一部分endl;
}
int main()
{pthread_t tid;ThreadData*tdnew ThreadData(Thread 1,uint64_t(time(nullptr)),print);pthread_create(tid,nullptr,ThreadRoutine,td);while(true){coutI am main Threadendl;sleep(1);}
} 也可以像下面这样多线程传参。
#includeiostream
#includestring
#includefunctional
#includevector
#includepthread.h
#includeunistd.h
#includetime.h
using namespace std;
using func_tfunctionvoid();
const int threadnum5;
class ThreadData
{public:ThreadData(const stringname,const uint64_tctime,func_t f):threadname(name),createtime(ctime),func(f){}public:string threadname;uint64_t createtime;func_t func;
};
void *ThreadRoutine(void*args)
{ThreadData*tdstatic_castThreadData*(args);while(true){coutI am new Thread td-threadname td-createtime endl;td-func();sleep(1);}}
void print()
{cout我是线程执行的大任务的一部分endl;
}
int main()
{for(int i0;ithreadnum;i){pthread_t tid;char threadname[64];snprintf(threadname,sizeof threadname,%s-%d,thread,i);ThreadData*tdnew ThreadData(threadname,uint64_t(time(nullptr)),print);pthread_create(tid,nullptr,ThreadRoutine,td);}while(true){coutI am main Threadendl;sleep(1);}
} 上面提到多线程代码健壮性低。 一个线程出错全都会崩溃。