Linux多线程

合集下载

linux多线程 pthread常用函数详解

linux多线程 pthread常用函数详解

linux多线程pthread常用函数详解Linux多线程是指在Linux操作系统中运行的多个线程。

线程是执行程序的基本单位,它独立于其他线程而存在,但共享相同的地址空间。

在Linux中,我们可以使用pthread库来实现多线程程序。

本文将详细介绍pthread库中常用的函数,包括线程的创建、退出、同步等。

一、线程创建函数1. pthread_create函数pthread_create函数用于创建一个新线程。

其原型如下:cint pthread_create(pthread_t *thread, const pthread_attr_t *attr, void*(*start_routine) (void *), void *arg);参数说明:- thread:用于存储新线程的ID- attr:线程的属性,通常为NULL- start_routine:线程要执行的函数地址- arg:传递给线程函数的参数2. pthread_join函数pthread_join函数用于等待一个线程的结束。

其原型如下:int pthread_join(pthread_t thread, void retval);参数说明:- thread:要等待结束的线程ID- retval:用于存储线程的返回值3. pthread_detach函数pthread_detach函数用于将一个线程设置为分离状态,使其在退出时可以自动释放资源。

其原型如下:cint pthread_detach(pthread_t thread);参数说明:- thread:要设置为分离状态的线程ID二、线程退出函数1. pthread_exit函数pthread_exit函数用于退出当前线程,并返回一个值。

其原型如下:cvoid pthread_exit(void *retval);参数说明:- retval:线程的返回值2. pthread_cancel函数pthread_cancel函数用于取消一个线程的执行。

Linux内核多线程实现方法

Linux内核多线程实现方法

Linux内核多线程实现⽅法 —— kthread_create函数内核经常需要在后台执⾏⼀些操作,这种任务就可以通过内核线程(kernle thread)完成独⽴运⾏在内核空间的标准进程。

内核线程和普通的进程间的区别在于内核线程没有独⽴的地址空间,mm指针被设置为NULL;它只在内核空间运⾏,从来不切换到⽤户空间去;并且和普通进程⼀样,可以被调度,也可以被抢占。

实际上,内核线程只能由其他内核线程创在现有的内核线程中创建⼀个新的内核线程的⽅法:建,在现有的内核线程中创建⼀个新的内核线程的⽅法:kthread_create:创建线程。

struct task_struct *kthread_create(int (*threadfn)(void *data),void *data,const char *namefmt, ...); //注意,第⼆个参数data⽤于向线程传递参数线程创建后,不会马上运⾏,⽽是需要将kthread_create() 返回的task_struct指针传给wake_up_process(),然后通过此函数运⾏线程。

kthread_run :创建并启动线程的函数,相当于kthread_create + wake_up_process功能;struct task_struct *kthread_run(int (*threadfn)(void *data),void *data,const char *namefmt, ...);kthread_stop:通过发送信号给线程,使之退出。

会⼀直运⾏,除⾮该线程主动调⽤do_exit函数,或者其int kthread_stop(struct task_struct *thread); 线程⼀旦启动起来后,会⼀直运⾏他的进程调⽤kthread_stop函数,结束线程的运⾏。

但如果线程函数正在处理⼀个⾮常重要的任务,它不会被中断的。

当然如果线程函数永远不返回并且不检查信号,它将永远都不会停⽌,因此,线程函数必须能让出CPU,以便能运⾏其他线程。

Linux命令高级技巧使用xargs和parallel进行多线程命令执行

Linux命令高级技巧使用xargs和parallel进行多线程命令执行

Linux命令高级技巧使用xargs和parallel进行多线程命令执行在Linux系统中,命令行操作是一项非常重要的技能,掌握高级的命令行技巧对于提高工作效率和简化复杂任务是至关重要的。

本文将介绍如何使用xargs和parallel命令进行多线程命令执行的高级技巧。

1. 使用xargs进行多线程命令执行在Linux系统中,xargs命令可以用于将标准输入的内容转化为命令行参数,并将这些参数传递给指定命令进行执行。

这使得我们可以方便地并行执行多个命令,提高执行效率。

xargs的基本语法如下:```command | xargs [options] command ...```其中,第一个command产生一系列的参数,这些参数将作为输入传递给后面的command进行执行。

下面是一个示例,展示如何使用xargs命令同时查找多个文件中包含指定关键字的行数:```find /path/to/files -name "*.txt" | xargs grep -c "keyword"```在这个例子中,find命令用于查找指定路径下的所有扩展名为.txt的文件,并将文件列表传递给xargs命令。

xargs命令再将这些文件名作为参数传递给grep命令,执行关键字查找操作。

2. 使用parallel进行多线程命令执行与xargs类似,parallel也可以用于并行执行多个命令。

不同的是,parallel可以更精确地控制线程数量和命令执行顺序。

parallel的基本语法如下:```parallel [options] command < list-of-inputs```其中,command是需要并行执行的命令,list-of-inputs是作为命令参数的输入列表。

下面的示例展示了如何使用parallel命令在多个服务器上复制文件:```parallel -S server1,server2,server3 cp source_file {} ::: destination1 destination2 destination3```在这个例子中,-S选项指定了要在哪些服务器上执行命令。

跟我学Linux编程-12-多线程编程-同步

跟我学Linux编程-12-多线程编程-同步

多线程编程-同步在上一章节中,我们通过程序示例,见证了单线程世界中不可能发生的事件(一个数既是奇数又是偶数)在多线程环境中是怎样分分钟发生的,我通过细分程序执行步骤,分析了奇异事件发生的过程,并探明了其原因:一个线程在对全局变量gcnt进行两次判读的过程中,另一个线刚好改变了这个变量的值。

在多线程编程术语中,称这两个线程同时进入了临界区域。

所谓临界区域,是指多线程环境下两个及以上线程同时执行可能会导致冲突的一段代码。

在上一章节的示例中,这几行代码就是一个临界区域:gcnt++;if (gcnt % 2){if (!(gcnt % 2)) printf("[%d] : %d\n", id, gcnt);}冲突之所以会发生,是因为临界区域的代码,通常需要很多个CPU指令周期才能完成,其运行过程随时可能被打断(进行了线程调试),CPU去运行另外的线程,如果这个线程刚好也进入了临界区域,则异常的程序状态极可能会发生。

如果当某个线程进入临界区域,在其退出区域之前,其他的线程无论如何也不能进入该区域,那么冲突就不会发生。

Linux提供了这种保证多线程进入临界区域互斥的机制,这正是本章节所要介绍的内容:线程锁。

我们今天的示例程序还是在上一章节的示例上改进而来的,我们的任务就是使用线程锁,保证“一个数既是奇数又是偶数”的奇异事件在多线程环境下也不发生,代码如下:#include <pthread.h>#include <stdio.h>#include <unistd.h>int gcnt = 0;pthread_mutex_t g_mutex;void *thread_task(void *arg){int id = (int)arg;while (1){pthread_mutex_lock(&g_mutex);gcnt++;if (gcnt % 2)if (!(gcnt % 2)) printf("[%d] : %d\n", id, gcnt);}pthread_mutex_unlock(&g_mutex);usleep(1);}return NULL;}int main(int argc, char *argv[]){pthread_t thr;pthread_mutex_init(&g_mutex, NULL);pthread_create(&thr, NULL, thread_task, (void *)1);pthread_create(&thr, NULL, thread_task, (void *)2);thread_task((void *)0);return 0;}今天的程序相对于上章的代码,改动非常小,只添加了四行,已使用红色加粗标注。

linux pthread 用法

linux pthread 用法

linux pthread 用法Linux pthread(POSIX线程)是一种多线程库,它提供了在Linux系统上创建和管理线程的API。

使用pthread库,可以编写多线程程序,实现并发执行和资源共享。

下面是一些常用的pthread函数和用法:1.pthread_create():用于创建一个新的线程。

它接受一个指向线程属性的指针,一个指向线程函数的指针,以及传递给线程函数的参数。

函数原型为:intpthread_create(pthread_t *thread, const pthread_attr_t *attr, void*(*start_routine) (void *), void *arg);2.pthread_join():用于等待一个线程的结束。

它接受一个指向线程标识符的指针,以及一个指向用于存储线程返回值的指针的指针。

函数原型为:intpthread_join(pthread_t thread, void **retval);3.pthread_self():用于获取当前线程的标识符。

函数原型为:pthread_tpthread_self(void);4.pthread_detach():用于将一个线程从系统中分离出去。

这通常用于在后台运行的任务,不需要手动等待它们完成。

函数原型为:int pthread_detach(pthread_t thread);5.pthread_equal():用于比较两个线程标识符是否相等。

函数原型为:intpthread_equal(pthread_t thread1, pthread_t thread2);6.pthread_mutex_init():用于初始化一个互斥锁。

函数原型为:intpthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr); 7.pthread_mutex_lock():用于获取一个互斥锁。

Linux多线程实例练习-pthread_create()

Linux多线程实例练习-pthread_create()

Linux多线程实例练习-pthread_create()Linux多线程实例练习 pthread_create():创建⼀个线程int pthread_create(pthread_t *tidp,const pthread_attr_t *attr,(void*)(*start_rtn)(void*),void *arg);1、代码如下xx_pthread_create.c1 #include <pthread.h>2 #include <stdio.h>3 #include <unistd.h>4 #include <sys/time.h> // for gettimeofday56#define debugMsg(fmt, arg...)\7do{\8 unsigned long lSec = 0; unsigned long lUSec = 0;\9 getTimeuSec(&lSec, &lUSec);\10 printf("[%ld.%06ld]:", lSec, lUSec);\11 printf(fmt, ##arg);\12 }while(0)1314int getTimeuSec(unsigned long *lSec, unsigned long *lUSec)15 {16struct timeval start;17 gettimeofday( &start, NULL );18 *lSec = _sec;19 *lUSec = _usec;2021return0;22 }23void * doPrint(void *arg)24 {25int i = 0;26while(i < 30)27 {28 debugMsg("pthread %2d; main %d\n", i++, *(int*)arg);29 usleep(200000);30 }3132return NULL;33 }3435int main()36 {37 pthread_t pid;38int iX = 123;39 pthread_create(&pid, NULL, doPrint, &iX);40while(iX <= 20 + 123)41 {42 debugMsg("main : %d\n", iX++);43 usleep(300000);44 }4546return0;47 }2、CentOS 下编译通过g++ -g -c -o xx_pthread_create.o xx_pthread_create.cg++ -g -o xx_pthread_create xx_pthread_create.o -lpthread3、运⾏结果[1422496189.763862]:main : 123[1422496189.764341]:pthread 0; main 124[1422496189.965627]:pthread 1; main 124[1422496190.065601]:main : 124[1422496190.166510]:pthread 2; main 125[1422496190.366393]:main : 125[1422496190.367391]:pthread 3; main 126[1422496190.568275]:pthread 4; main 126[1422496190.667215]:main : 126[1422496190.769157]:pthread 5; main 127[1422496190.968039]:main : 127[1422496190.970323]:pthread 6; main 128[1422496191.171922]:pthread 7; main 128[1422496191.269869]:main : 128 [1422496191.373803]:pthread 8; main 129 [1422496191.571696]:main : 129 [1422496191.574958]:pthread 9; main 130 [1422496191.776566]:pthread 10; main 130 [1422496191.873512]:main : 130 [1422496191.977457]:pthread 11; main 131 [1422496192.174348]:main : 131 [1422496192.178362]:pthread 12; main 132 [1422496192.379214]:pthread 13; main 132 [1422496192.475159]:main : 132 [1422496192.580095]:pthread 14; main 133 [1422496192.776006]:main : 133 [1422496192.781267]:pthread 15; main 134 [1422496192.981968]:pthread 16; main 134 [1422496193.076864]:main : 134 [1422496193.182797]:pthread 17; main 135 [1422496193.377656]:main : 135 [1422496193.384089]:pthread 18; main 136 [1422496193.584595]:pthread 19; main 136 [1422496193.678472]:main : 136 [1422496193.785406]:pthread 20; main 137 [1422496193.980296]:main : 137 [1422496193.987689]:pthread 21; main 138 [1422496194.189201]:pthread 22; main 138 [1422496194.281149]:main : 138 [1422496194.390049]:pthread 23; main 139 [1422496194.582987]:main : 139 [1422496194.590944]:pthread 24; main 140 [1422496194.792793]:pthread 25; main 140 [1422496194.883821]:main : 140 [1422496194.993852]:pthread 26; main 141 [1422496195.184826]:main : 141 [1422496195.195665]:pthread 27; main 142 [1422496195.397447]:pthread 28; main 142 [1422496195.486468]:main : 142 [1422496195.598408]:pthread 29; main 143 [1422496195.787329]:main : 143。

Linux多线程编程问题

Linux 多线程编程问题1重入问题传统的UNIX没有太多考虑线程问题,库函数里过多使用了全局和静态数据,导致严重的线程重入问题。

1.1–D_REENTRANT /-pthread和errno的重入问题。

所先UNIX的系统调用被设计为出错返回-1,把错误码放在errno中(更简单而直接的方法应该是程序直接返回错误码,或者通过几个参数指针来返回)。

由于线程共享所有的数据区,而errno是一个全局的变量,这里产生了最糟糕的线程重入问题。

比如:do {bytes = recv(netfd, recvbuf, buflen, 0);} while (bytes != -1 && errno != EINTR);在上面的处理recv被信号打断的程序里。

如果这时连接被关闭,此时errno应该不等于EINTR,如果别的线程正好设置errno为EINTR,这时程序就可能进入死循环。

其它的错误码处理也可能进入不可预测的分支。

在线程需求刚开始时,很多方面技术和标准(TLS)还不够成熟,所以在为了解决这个重入问题引入了一个解决方案,把errno定义为一个宏:extern int *__errno_location (void);#define errno (*__errno_location())在上面的方案里,访问errno之前先调用__errno_location()函数,线程库提供这个函数,不同线程返回各自errno的地址,从而解决这个重入问题。

在编译时加-D_REENTRANT就是启用上面的宏,避免errno重入。

另外-D_REENTRANT还影响一些stdio的函数。

在较高版本的gcc里,有很多嵌入函数的优化,比如把printf(“Hello\n”);优化为puts(“hello\n”);之类的,有些优化在多线程下有问题。

所以gcc引入了–pthread 参数,这个参数出了-D_REENTRANT外,还校正一些针对多线程的优化。

linux和windows通用的多线程方法

linux和windows通用的多线程方法
多线程是一种在计算机程序中处理多个相似或相关的任务的技术。

无论是在Linux还是Windows中,多线程的实现都是类似的。

以下是一些通用的多线程方法:
1. 创建线程:使用线程库中提供的函数,例如在Linux中使用pthread_create(),在Windows中使用CreateThread()。

2. 同步线程:使用同步机制来保护共享资源,例如在Linux中使用pthread_mutex_lock()和pthread_mutex_unlock(),在Windows 中使用CriticalSection。

3. 线程间通信:使用消息传递或共享内存等机制来实现线程间通信。

在Linux中,可以使用管道、共享内存和信号量等。

在Windows 中,可以使用命名管道和邮槽等。

4. 线程池:创建一个线程池来管理多个线程,这样可以避免频繁地创建和销毁线程,提高效率。

5. 轮询:使用循环不断地检查线程是否完成任务,从而避免阻塞主线程。

总的来说,多线程在Linux和Windows中的实现都是类似的,只要掌握了基本的多线程概念和方法,就可以在两个操作系统中进行开发。

第6章 linux进程控制开发及多线程编程


进程的状态
进程是程序的执行过程,根据它的生命周期可以划分成3种 状态。 执行态:该进程正在运行,即进程正在占用CPU。 就绪态:进程已经具备执行的一切条件,正在等待分配 CPU的处理时间片。 等待态:进程不能使用CPU,若等待事件发生(等待的 资源分配到)则可将其唤醒。
Linux下进程地址空间(1)
互斥锁线程控制 (1)
在同一时刻只能有一个线程掌握某个互斥锁,拥有上锁状态 的线程能够对共享资源进行操作。若其他线程希望上锁一个 已经被上锁的互斥锁,则该线程就会挂起,直到上锁的线程 释放掉互斥锁为止。
互斥锁机制主要包括下面的基本函数。 互斥锁初始化: pthread_mutex_init() 互斥锁上锁: pthread_mutex_lock() 互斥锁判断上锁:pthread_mutex_trylock() 互斥锁解锁: pthread_mutex_unlock() 消除互斥锁: pthread_mutex_destroy()
示例
阅读并执行示例7-2-4 开始
教材P216-P217
fork()
程序功能: (1)使用fork创建一个子进程, 然后让其子进程暂停5s(sleep函 数)。 (2)父进程使用waitpid,参数 WNOHANG使进程不会阻塞; (3)若子进程退出,则waitpid返 回子进程号,若没有则waitpid返 回0,并且父进程每隔一秒循环判 断。
因此,可以通过返回值来判定该进程是父进程还是子进程。
fork示例
1.Fork返回两个值返回到哪里??
int main(void)
{

pid_t result;
2.怎样区分是父、子进程??

result = fork();

linux多线程编程的书 -回复

linux多线程编程的书-回复
以下是一些关于Linux多线程编程的推荐书籍:
1. 《Linux多线程服务端编程:使用muduo C++网络库》- 陈硕。

这本书详细介绍了多线程服务器编程的基本概念和思想,并使用muduo网络库作为示例来说明。

2. 《Linux高性能服务器编程》- 游双。

这本书介绍了Linux上高性能服务器的开发方法和技巧,包括多线程编程、网络编程等方面。

3. 《Linux多线程编程实战》- 李立宏。

这本书以C/C++语言为基础,介绍了Linux下多线程编程的基本知识、实践技巧和案例。

4. 《Linux多线程服务器编程:使用Pthreads和GTK+》- Blaise Barney。

这本书主要介绍了使用Pthreads和GTK+在Linux中进行多线程服务器编程的方法和技巧。

5. 《Linux多线程编程指南》- 夏葆元。

这本书介绍了Linux多线程编程的基本概念,包括线程同步、互斥锁、条件变量等,并提供了丰富的示例代码和实践案例。

以上是一些关于Linux多线程编程的推荐书籍,您可以根据自己的需求和
学习水平选择适合自己的一本来学习。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

• 两个函数的第一个参数都是属性。 • pthread_attr_setdetachstate用来设置分离属性,第二个参数 有两个值PTHREAD_CREATE_DETACHED 和
PTHREAD_CREATE_JOINABLE。 • pthread_attr_getdetachstate用来获取分离状态。
说明 线程的分离状态属性 线程栈末尾的警戒缓冲区大小 线程栈的最低地址 线程栈的大小(字节)
线程分离属性
#include <pthread.h> int pthread_detach(pthread_t thread); • 当一个线程被创建时,系统给它创建一个线程控制块(有 thread id来标识)。如果线程没有设置分离属性,那么需 id来标识)。如果线程没有设置分离属性,那么需 要其它线程通过pthread_join来回收这个线程控制块。如果 要其它线程通过pthread_join来回收这个线程控制块。如果 设置了分离属性,那么线程结束时自动释放创建时分配的 资源。 • pthread_detach用来设置分离属性,但须注意必须在新创建 的线程结束之前!一般来说这个函数是有新建线程进入启 动函数后立马调用的,pthread_detach(pthread_self())
ห้องสมุดไป่ตู้
线程池
• 在程序设计中,并不是来一个任务/请求就 在程序设计中,并不是来一个任务/ 创建一个线程,执行完毕线程退出。 • 程序初始化时创建一个线程池,线程池中 有n个线程。 • 当一个请求来时,从线程池中取一个线程, 完成请求后线程再放回线程池。 • 节省了频繁创建线程和销毁线程的开销。
pthread
pthread_join.c
线程ID 线程ID
#include <pthread.h> pthread_t pthread_self(void); int pthread_equal(pthread_t t1, pthread_t t2);
• pthread_self返回调用线程的线程ID。 pthread_self返回调用线程的线程ID。 • 当比较两个线程是否是同一个线程,需要 用pthread_equal.
• pthread_create用来创建一个线程。 pthread_create用来创建一个线程。 • 成功返回0,失败返回非0。 成功返回0,失败返回非0 • thread指向内存单元将被设置为新创建的线 thread指向内存单元将被设置为新创建的线 程ID,attr是要创建线程的属性(NULL为 ID,attr是要创建线程的属性(NULL为 默认属性),start_routine为线程开始执行 默认属性),start_routine为线程开始执行 的函数,arg为start_routine的参数。 的函数,arg为start_routine的参数。 • 线程共享全局变量,在一个线程中改变对 另外线程可见。
线程分离属性
#include <pthread.h> int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate); int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
global.c
pthread_create()
• arg不能是局部变量,否则线程使用该变量 arg不能是局部变量,否则线程使用该变量 时可能已经被修改或者不存在了。 • start_routine的参数和返回值都为void *,如果 start_routine的参数和返回值都为void *,如果 有多个参数,那只能打包成一个结构体了。 返回值不能是局部变量!! • 主线程退出,则整个进程结束。
fork()
多线程中的信号
• 在linux系统中信号是用来通知进程特殊事件 linux系统中信号是用来通知进程特殊事件 发生了 • 多线程中有哪个线程来处理呢? • 信号会被递送给恰当的线程,比如SIGILL 信号会被递送给恰当的线程,比如SIGILL 非法指令。 • 信号会被递送给进程中任意的线程处理。 • 在多线程环境我们一般指定一个线程专门 处理信号,其余线程全部屏蔽信号处理。
• guardsize用来设置栈溢出后,还可以使用的 栈的大小,一般为一个PAGESIZE。也称警 戒缓冲区。 • 如果我们对stackaddr做了修改 ,那么系统会 假设我们自己会管理栈,不会提供警戒缓 冲区给我们使用。相当于设置guardsize为0。
线程同步
• 当多个线程共享相同的内存时,就需要确 保每个线程看到一致的数据。 • 如果数据是只读的,那么不存在一致性问 题。 • 如果线程对数据有读有些,这时候就需要 同步机制来保证数据的一致性。
• A POSIX standard (IEEE 1003.1c) API for thread creation and synchronization。 synchronization。 • pthread大概有60多个函数,包括线程的创建、终 pthread大概有60多个函数,包括线程的创建、终 止等。 • Linux中实现了pthread线程库 Linux中实现了pthread线程库 • Unix/Widows中也有pthread的实现。 Unix/Widows中也有pthread的实现。 • Linux中使用pthead方法为: Linux中使用pthead方法为: #include <pthread.h> gcc main.c –lpthread 注意:必须加lpthread,不像glibc库,gcc不会自动去 注意:必须加lpthread,不像glibc库,gcc不会自动去 链接pthread库。 链接pthread库。
• 注意:线程一旦设置了分离状态,再调用 pthread_join就会出错。
pthread_attr_detac h.c
线程栈属性
#include <pthread.h> int pthread_attr_getstack(const pthread_attr_t *restrict attr, void **restrict stackaddr, size_t *restrict stacksize); int pthread_attr_setstack(pthread_attr_t *attr, void *stackaddr, size_t stacksize);
pthread_exit
#include <pthread.h> void pthread_exit(void *value_ptr); int pthread_join(pthread_t thread, void **value_ptr);
• 调用pthread_exit后,线程终止。 调用pthread_exit后,线程终止。 • 参数 参数value_ptr会被后来调用pthread_join函数 的线程获得! • pthread_join的第一个参数指定某个线程, 第二个参数用来接收线程的退出值。
线程同步
• 需要一种机制确 保变量修改时, 只有一个线程在 访问。这样就能 保证数据的一致 性。
互斥量
• 我们可以使用pthread库提供的互斥量来确 我们可以使用pthread库提供的互斥量来确 保同一时间只有一个线程访问数据。 • 互斥量其实就是一种锁,在访问共享数据 之前设置这个锁,访问完之后释放这个锁。 • 互斥量一旦被加了锁,其他任何线程再也 不能在这个互斥量上加锁,需等到锁被释 放。
create_local. rimary_exit.c
线程终止
• 如果进程中的任意线程调用exit、_exit、 如果进程中的任意线程调用exit、_exit、 _Exit,那么整个进程都会被终止。 _Exit,那么整个进程都会被终止。 • 线程从启动函数中返回,返回值是线程的 退出码。 • 线程可以被其他线程取消 • 线程调用pthread_exit退出。 线程调用pthread_exit退出。
线程属性
• pthread_create的第二个参数就是线程的属性, pthread_create的第二个参数就是线程的属性, 传入NULL表示使用默认属性。 传入NULL表示使用默认属性。 • 可以用过pthread API来修改线程的属性。 可以用过pthread API来修改线程的属性。
属性名称 detachstate guardsize stackaddr stacksize
线程栈属性
#include <pthread.h> int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,size_t *restrict guardsize); int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
main.c
线程创建:pthread_create() 线程创建:
#include <pthread.h> int pthread_create(pthread_t *restrict thread, const pthread_attr_t *restrict attr, void *(*start_routine)(void*), void *restrict arg);
多线程模型
• 内核线程和用户线程的对应关系 • 一个内核线程对应n个用户线程(用户级线 一个内核线程对应n 程) • 一个内核线程对应一个用户线程(内核级 线程)
用户级线程
内核级线程
多线程中的fork 多线程中的fork
• 在linux系统当一个拥有多线程的进程调用 linux系统当一个拥有多线程的进程调用 fork时,子进程只会有一个线程! fork时,子进程只会有一个线程!
相关文档
最新文档