OSLab多线程
Posted sinkinben
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OSLab多线程相关的知识,希望对你有一定的参考价值。
?
日期:2019/3/26
内容:多线程。
一、基本知识
- 线程的定义
线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
(待补充)
- 并发特性
当前的进程可以理解为一个主线程,新建的进程称为工作线程。主线程与工作线程交织并发执行。(见2.1的代码实例)
- 使用线程时,需要链接pthread库
gcc f.c -o f -lpthread |
?
二、线程的系统调用
2.1 创建线程(pthread_create)
- 原型:int pthread_create(pthread_t *tid, pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
- 功能:
>>创建一个线程
>>新线程从start_routine开始执行
>>新线程的ID保存在tid指向的位置
- 返回值:成功0,失败非0。(实际是返回-1,但是习惯上使用!=0判断更好)
- 参数解析
参数 | 功能 |
tid | 该参数是一个指针, 新线程的ID保存在tid指向的位置 |
attr | 线程属性。如果为空,则使用缺省的属性值 |
start_routine | 该参数是一个函数指针, 新线程从start_routine开始执行 |
arg | 提供给start_routine的参数 |
- attr解析(需要用时补充)
- arg解析
>>对于整型变量
int ivalue = 123; void *arg = (void *) ivalue; |
>>字符串(如下代码实例)
>>结构体
struct person { char *name; int age; } p; void *arg = (void *) &p; |
- 并发代码实例
void *thread_run(void *args) { ????int i = 5; ????const char *str = (const char *)(args); ????while(i--) ????{ ????????printf("%s running...\\n", str); ????????sleep(1); ????} ????return NULL; } ? int main() { ????pthread_t ptid; ????pthread_create(&ptid, NULL, &thread_run, "subthread"); ? ????int i = 5; ????while(i--) ????{ ????????puts("main thread running..."); ????????sleep(1); ????} ????return 0; } |
以上是关于OSLab多线程的主要内容,如果未能解决你的问题,请参考以下文章