线程

来源:互联网 发布:淘宝充值软件 编辑:程序博客网 时间:2024/06/05 16:14

(摘自操作系统书籍)

线程定义:线程是进程内的一个实体,是被OS独立调用的基本单位,又称为轻权进程。

-----------------------------------------------分割线----------------------------------------------------------

(以下摘自《linux C 语言编程一站式学习》)

进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机

-----------------------------------------------分割线----------------------------------------------------------

为何使用线程?

比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘

事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些

任务都需要一个等待-处理的循环,可以用多线程实现,一个线程专门负责与用户交互,另

外几个线程每个线程负责和一个网络主机通信。

-----------------------------------------------分割线----------------------------------------------------------

一个进程的地址空间中执行多个线程 (换句话说就是讲一个进程中实现多线程)
多线程的控制流程可以长期并存,操作系统会在各线程之间调度和切换,就像在
多个进程之间调度和切换一样。由于同一进程的多个线程共享同一地址空间,因此
Text
Segment
Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一
个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
文件描述符表
每种信号的处理方式(
SIG_IGNSIG_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)









原创粉丝点击