一件事可以分身来做哪有多爽,今天浅尝多线程。
例子参考写完这个排序算法,老板就叫我滚蛋…
手册
条目 | 内容 |
---|---|
pthreads(7) | 线程知识 |
pthread_create(3) | 创建线程 |
pthread_join(3) | 等待线程结束 |
pthread_cancel(3) | 通知线程结束 |
浅尝
有了多进程为什么还要有多线程?那是因为多进程是一个重量级的动作,fork出来的进程会在某一时刻将父进程的一些资源复制给子进程,一方面需要空间,另一方面进程的管理需要内核管理,总之是代价多多。线程就轻量级多了,不需要额外那么多空间,多线程管理也主要在用户层。
代码演示
参考文章是java代码,我用C写了一下。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
static void* thread_func(void *arg){
usleep(*(int *)arg);
printf("%d\n", *(int *)arg);
}
int main()
{
int ret = -1;
int nums[] = {11, 3, 998, 5455, 1, 152, 990};
pthread_t tid[sizeof(nums)/sizeof(int)];
int i;
for (i = 0; i < sizeof(nums)/sizeof(int); ++i){
ret = pthread_create(&tid[i], NULL, thread_func, &nums[i]);
//出错处理
if (ret){
printf("No.%d error:%s\n", i, strerror(ret));
while (i > 0){
pthread_cancel(tid[i - 1]);
pthread_join(tid[i - 1], NULL);
--i;
}
exit(EXIT_FAILURE);
}
}
//等待所有线程结束后,退出主线程
for (i = 0; i < sizeof(nums)/sizeof(int); ++i){
pthread_join(tid[i], NULL);
}
return 0;
}
输出
1
3
11
152
990
998
5455