当前位置: 技术问答>linux和unix
linux多线程的一些疑问
来源: 互联网 发布时间:2016-12-03
本文导语: 用c语言编译器编译出来的控制台应该不是多线程(单任务)的吧?但是调用了pthread库里的函数就变成多线程了,我这样理解对不对 | 在一个线程中调用pthread_create()创建新的线程后,当前线程从pthread_create()...
用c语言编译器编译出来的控制台应该不是多线程(单任务)的吧?但是调用了pthread库里的函数就变成多线程了,我这样理解对不对
|
在一个线程中调用pthread_create()创建新的线程后,当前线程从pthread_create()返回继续往下执行,而新的线程所执行的代码由我们传给pthread_create的函数指针start_routine决定。start_routine函数接收一个参数,是通过pthread_create的arg参数传递给它的,该参数的类型为void *,这个指针按什么类型解释由调用者自己定义。start_routine的返回值类型也是void *,这个指针的含义同样由调用者自己定义。start_routine返回时,这个线程就退出了,其它线程可以调用pthread_join得到start_routine的返回值,类似于父进程调用wait(2)得到子进程的退出状态,稍后详细介绍pthread_join。
pthread_create成功返回后,新创建的线程的id被填写到thread参数所指向的内存单元。我们知道进程id的类型是pid_t,每个进程的id在整个系统中是唯一的,调用getpid(2)可以获得当前进程的id,是一个正整数值。线程id的类型是thread_t,它只在当前进程中保证是唯一的,在不同的系统中thread_t这个类型有不同的实现,它可能是一个整数值,也可能是一个结构体,也可能是一个地址,所以不能简单地当成整数用printf打印,调用pthread_self(3)可以获得当前线程的id。
pthread_create成功返回后,新创建的线程的id被填写到thread参数所指向的内存单元。我们知道进程id的类型是pid_t,每个进程的id在整个系统中是唯一的,调用getpid(2)可以获得当前进程的id,是一个正整数值。线程id的类型是thread_t,它只在当前进程中保证是唯一的,在不同的系统中thread_t这个类型有不同的实现,它可能是一个整数值,也可能是一个结构体,也可能是一个地址,所以不能简单地当成整数用printf打印,调用pthread_self(3)可以获得当前线程的id。
|
调用了pthread_create是多线程
|
多线程只是你程序模型的概念,对于操作系统来看不管你是1线程程序还是n线程程序,没有什么区别。调用pthread_create函数只是通知os,给你再加一个线程。
|
什么时候执行由操作系统根据调度算法决定
pthread_join等待的线程还没有结束的话,调用的线程会挂起,不会执行下一条语句
请仔细看文档,这种文档里描述很清楚的问题。。。。。。。。
pthread_join等待的线程还没有结束的话,调用的线程会挂起,不会执行下一条语句
请仔细看文档,这种文档里描述很清楚的问题。。。。。。。。
|
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
参数3可以指定新加这个线程执行的任务啊。
看书看闷了可以写点测试程序。
光看书没用
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
参数3可以指定新加这个线程执行的任务啊。
看书看闷了可以写点测试程序。
光看书没用
|
信号量是解决多线程同步问题的,建议你看看UNIX环境高级编程的第11章(线程)和第十二章(线程控制)