线程(一)概念、创建、标识、终止、连接、分离、属性
概念
- 使用多线程在做串行任务时,需要阻塞。
线程比进程有优势的地方
- 同一个进程的多个线程可以并发执行
进程 VS 线程
进程堆栈
线程共享的资源属性
线程数据类型
线程标识
- 进程ID是唯一的,但线程ID只有在所属的进程上下文才有意义。
对两个线程ID进行比较。
获取自身线程ID
判断两个线程ID是否相同
线程池工作任务
线程创建
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h> // exit()
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.\n", s, (unsigned long)pid, (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) // 1表示失败
{
//err_exit(err, "error");
exit(1);
}
printids("main thread:");
sleep(1);
return 0;
}
线程终止的方法
pthread_exit
pthread_join
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
void *fn(void *arg)
{
char *str = (char *)arg; // 用来强制转换类型,接受参数
printf("%s", str);
return (void *)strlen(str); // 可以强制转为void * 来返回参数
}
int main(void){
pthread_t tid;
int err;
void *res; // 用来接受线程的返回值
err = pthread_create(&tid, NULL, fn, "Hello world!\n");
if (err != 0){ // 1:失败
perror("Error pthread create.\n");
exit(1);
}
printf("Message from main().\n");
err = pthread_join(tid, &res);
if (err != 0) // join也是可以判断失败与否,1:失败
{
perror("Error pthread join.\n");
exit(1);
}
printf("Thread return value:%ld.\n", (long)res); // long好一点,默认数字有点大
return 0;
}
线程分离
线程分离
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
void * fn(void * arg)
{
int *i = (int *) arg;
printf("value : %d.\n", *i);
}
int main(void){
pthread_t tid;
pthread_attr_t attr;
int s;
// 先初始化attr
s = pthread_attr_init(&attr);
if (s != 0)
{
perror("pthread_attr_init");
exit(1);
}
// 设置attr属性
s = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (s != 0)
{
perror("pthread_attr_setdetachstate.\n");
exit(1);
}
// 用attr属性创建新线程
s = pthread_create(&tid, &attr, fn, (void *)1);
if (s != 0)
{
perror("pthread_attr_create");
exit(1);
}
return 0;
}