线程
来源:互联网 发布:淘宝充值软件 编辑:程序博客网 时间:2024/06/05 16:14
(摘自操作系统书籍)
线程定义:线程是进程内的一个实体,是被OS独立调用的基本单位,又称为轻权进程。
-----------------------------------------------分割线----------------------------------------------------------
(以下摘自《linux C 语言编程一站式学习》)
进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机
制 。
-----------------------------------------------分割线----------------------------------------------------------
为何使用线程?
比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘
事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些
任务都需要一个“等待-处理”的循环,可以用多线程实现,一个线程专门负责与用户交互,另
外几个线程每个线程负责和一个网络主机通信。
-----------------------------------------------分割线----------------------------------------------------------
在一个进程的地址空间中执行多个线程 (换句话说就是讲一个进程中实现多线程)
多线程的控制流程可以长期并存,操作系统会在各线程之间调度和切换,就像在
多个进程之间调度和切换一样。由于同一进程的多个线程共享同一地址空间,因此Text
Segment、 Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一
个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
文件描述符表
每种信号的处理方式( SIG_IGN、SIG_DFL或者自定义的信号处理函数)
当前工作目录
用户id和组id
但有些资源是每个线程各有一份的:
线程id上下文,包括各种寄存器的值、程序计数器和栈指针
栈空间
errno变量
信号屏蔽字
调度优先级
-----------------------------------------------分割线----------------------------------------------------------
采用的线程库函数是由POSIX标准定义的,称为POSIX thread或者pthread。在Linux上线
程函数位于libpthread共享库中,因此在编译时要加上-lpthread选项。
-----------------------------------------------分割线----------------------------------------------------------
创建线程:
#include <pthread.h>
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
返回值:成功返回0,失败返回错误号。
-----------------------------------------------分割线----------------------------------------------------------
在一个进程中使用线程:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
pthread_t ntid;
void printids(const char *s)
{
pid_t pid;
pthread_t tid;
656
pid = getpid();
tid = pthread_self();
printf("%s pid %u tid %u (0x%x)\n", s, (unsigned int)pid,
(unsigned int)tid, (unsigned int)tid);
}
void *thr_fn(void *arg)
{
printids(arg);
return NULL;
}
int main(void)
{
int err;
err = pthread_create(&ntid, NULL, thr_fn, "new thread: ");
if (err != 0) {
fprintf(stderr, "can't create thread: %s\n",
strerror(err));
exit(1);
}
printids("main thread:");
sleep(1);
return 0;
}
执行结果:
$ gcc main.c -lpthread
$ ./a.out
main thread: pid 7398 tid 3084450496 (0xb7d8fac0)
new thread: pid 7398 tid 3084446608 (0xb7d8eb90)
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- 线程
- MySQL(1)使用前的准备(安装版的安装步骤)
- 利用js解析php的表单数据
- Android面试——内存泄漏
- leetcode646 Maximum Length of Pair Chain java解题代码
- 堆与栈的区别
- 线程
- 第二周项目1 比较三种交换值的方法
- 2016CVTE校招在线笔试题
- Activiti源码跟踪之流程部署
- 【美图笔试题】蚂蚁爬杆
- Activity启动模式
- java redis使用之利用jedis实现redis消息队列
- 厚朴第一课笔记
- 数据结构与算法——不相交集类的C++实现