线程
2016-03-01 22:06
169 查看
在UNIX里面,一个进程(process) 可以包含多个线程,一个进程里面,所有线程共享进程里面的资源通常我们教科书上面的一个进程只包含了一个线程,就是说,在一个时间点,只能做一件事情,引入多线程以后,我们就可以在一个进程里面,同时做更多的事情,每个线程都分开做自己的事情。这样搞,有这些好处。在处理异步事件这种情况时,每个线程分别去处理一种事务。进程与进程之间沟通起来,需要非常复杂的搞法才能共享内存,文件描述符。相比较而言,各个线程之间天生拥有相同的文件描符和相同的内存地址空间。将一件事情,分开由各个线程去处理,可以简化问题的逻辑。 注意,多线程并不是一定要在多cpu(多核)才能实现1.3 如何去标识一个线程。就像每个进程有个进程号一样,每个线程都有一个线程ID. 这里注意,在同一个系统里面,进程号是唯一的,线程号只在同一个进程里面是唯一的,类似名字空间的意思。回忆一下,一个进程id, 一般由pid_t 去描述, 其实,就是一个整型实数。对于线程来说,我们一般用 pthread_t 数据类型去描述。1.4 线程的创建在UNIX 操作系统里,我们调用 pthread_create 这个函数去创建一个线程。
#include <pthread.h> int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rth)(void *), void *restrict arg); Returns: 0 if OK, error number on failure ~下面我们写个小程序,到程序里面去看一个线程是怎么工作的,下面这个程序,创建一个线程然后打印出线程事情和进程号。
<pre name="code" class="cpp">#include "apue.h" #include <pthread.h> pthread_t ntid; void printids(const char *s) { pid_t pid; pthread_t tid; pid = getpid(); tid = pthread_self(); printf("%s pid %lu tid %lu (0x%lx)\n", s, (unsigned long)pid, (unsigned long)tid, (unsigned long)tid); } void * thr_fn(void *arg) { printids("new thread: "); return((void *)0); } int main(void) { int err; err = pthread_create(&ntid, NULL, thr_fn, NULL); if (err != 0) err_exit(err, "can't create thread"); printids("main thread:"); sleep(1); exit(0); }结束一个线程如果进程中任意一个线程调用exit, _Exit, 或者_exit, 那么整个进程都会终止。单一的进程有三种退出方法,简单的从 start routine 返回, 返回值是这个线程的exit 代码。被同一个进程中的其他线程终止。自己调用pthread_exit下面代码从一个正在退出的线程里抓到退出码:
thread 1 returning thread 2 exiting thread 1 exit code 1 thread 2 exit code 2 Jiansongs-MacBook-Air:~ song$ vi pthread.c #include "apue.h" #include <pthread.h> void * thr_fn1(void *arg) { printf("thread 1 returning\n"); return ((void *)1); } void * thr_fn2(void *arg) { printf("thread 2 exiting\n"); pthread_exit((void *)2); } int main(void) { int err; pthread_t tid1, tid2; void *tret; err = pthread_create(&tid1, NULL, thr_fn1, NULL); if (err != 0) err_exit(err, "can't create thread 1"); err = pthread_create(&tid2, NULL, thr_fn2, NULL); if (err != 0) err_exit(err, "can't create thread 2"); err = pthread_join(tid1, &tret); if (err != 0) err_exit(err, "can't join with thread 1"); printf("thread 1 exit code %ld\n", (long)tret); err = pthread_join(tid2, &tret); if (err != 0) err_exit(err, "can't join with thread 2"); printf("thread 2 exit code %ld\n", (long)tret); exit(0); } ~ ~ ~ "pthread.c" 42L, 891C
线程同步
当多个线程共享同一段内存时,我们需要确保每个线程看到的自己的数据是一致的,如果每个线程用到的变
量是其他线程无法修改的,那么就不会存在一致性问题。同理,如果一个变量是只读的,那么多个线程同时
去读一个变量也不存在一致性问题,问题是,当一个线程去修改一个其他线程也可以修改值的变量,那么
我们就需要想办法,确保每次读到值是我们想要的(正确值).
为了解决这个问题,我们可以给变量加个锁,让一个时间段,只允许一个线程去访问它。
相关文章推荐
- Animation's Brother ---- Animator
- 《C语言程序设计(第二版新版)》第二章习题解答(部分)
- android 解决EditText无法失去焦点和失去焦点后隐藏软键盘的问题
- MySQLl导入数据出现--unknown command '\'
- 文本编辑器的使用(ckeditor/ueditor)
- Codeforces Round #259 (Div. 2) A. Little Pony and Crystal Mine
- HDOJ-2052(Picture)
- 转行自学android,Day9-彻底蒙圈
- 【JAVA】25、应用1——数组排列
- 浑浑噩噩
- 解决Maven并行编译中出现打包错误问题的思路
- 快速排序
- Axis2+Spring构建WebService
- Axis2+Spring构建WebService
- poj Cow Sorting 3270 (置换群)好题
- java.lang.IllegalArgumentException: Page directive: invalid value for import
- 核电站
- QT与泰剧
- Gradle之dependencies
- PAT-A1036 Boys vs Girls(25) (模拟)