Linux线程
线程
1.1 线程概述
1.2 线程常用API
线程方法使用
创建线程
#include <pthread.h>
int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
//返回值:若成功返回0,否则返回错误编号
详情介绍:
当pthread_create成功返回时,由tidp指向的内存单元被设置为新创建线程的线程ID。attr参数用于定制各种不同的线程属性,暂可以把它设置为NULL,以创建默认属性的线程。
新创建的线程从start_rtn函数的地址开始运行,该函数只有一个无类型指针参数arg。如果需要向start_rtn函数传递的参数不止一个,那么需要把这些参数放到一个结构中,然后把这个结构的地址作为arg参数传入。
3.线程等待
线程被阻塞
#include <pthread.h>
int pthread_join(pthread_t thread, void **rval_ptr);
// 返回值:若成功返回0,否则返回错误编号
调用这个函数的线程将一直阻塞,直到指定的线程调用pthread_exit、从启动例程中返回或者被取消。如果线程简单地从它的启动例程返回,rval_ptr将包含返回码。如果线程被取消,由rval_ptr指定的内存单元就置为PTHREAD_CANCELED。
可以通过调用pthread_join自动把线程置于分离状态,这样资源就可以恢复。如果线程已经处于分离状态,pthread_join调用就会失败,返回EINVAL。
4.线程ID获取及比较
#include <pthread.h>
pthread_t pthread_self(void);
//返回值:调用线程的ID
创建线程并且打印出它的id
demo.cpp
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *func1(void *arg)
{
printf("t1:%ld thread is create\n",(unsigned long)pthread_self());
// 将void*强制转换成int*然后解引用
printf("t1:param is %d\n",*((int*)arg));
}
int main()
{
int ret;
int param = 100;
pthread_t t1;
// int *pret = NULL;
int pret;
ret = pthread_create(&t1,NULL,func1,(void*)¶m);
if(ret==0)
{
printf("main:create t1 success\n");
}
// 等待线程结束后退出
pthread_join(t1,(void**)&pret);
printf("main:t1 quit:%d\n",pret);
return 0;
}
编译执行
g++ -o demo demo.cpp -pthread
编译 C++ 程序时,-pthread 是一个编译器选项,用于告诉编译器链接 POSIX 线程库,也就是通常所说的线程库。在 Linux 系统中,这个选项是编译多线程程序时必须的。
当你在编译命令中加入 -pthread 选项时,它通常需要出现在编译命令的两个地方:
在编译(但不链接)时,例如 g++ -pthread -c demo.cpp,这告诉编译器包含线程相关的代码和头文件。
在链接时,例如 g++ -pthread demo.o -o demo,这告诉链接器链接线程库。
验证共享变量
线程是共享进程的空间的,所以进程中的变量也是共享的,进行验证
写一个共享变量,然后每个线程都给这个变量加1;
变量等于3的时候退出,这样有可能会拿不到3
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
//int pthread_create(pthread_t *restrict tidp, const pthread_attr_t *restrict attr, void *(*start_rtn)(void *), void *restrict arg);
//这个是共享的变量
int g_data = 0;
void *func1(void *arg)
{
printf("t1:%ld thread is create\n",(unsigned long)pthread_self());
printf("t1:param is %d\n",*((int *)arg));
while(1){
//修改共享变量
printf("t1: %d\n",g_data++);
sleep(1);
if(g_data == 3){
pthread_exit(NULL);
}
}
}
void *func2(void *arg)
{
printf("t2:%ld thread is create\n",(unsigned long)pthread_self());
printf("t2:param is %d\n",*((int *)arg));
while(1){
//修改共享的变量
printf("t2: %d\n",g_data++);
sleep(1);
}
}
int main()
{
int ret;
int param = 100;
pthread_t t1;
pthread_t t2;
ret = pthread_create(&t1, NULL, func1,(void *)¶m);
if(ret == 0){
printf("main:create t1 success\n");
}
ret = pthread_create(&t2, NULL, func2,(void *)¶m);
if(ret == 0){
printf("main:create t2 success\n");
}
printf("main:%ld\n",(unsigned long)pthread_self());
while(1){
printf("main: %d\n",g_data++);
sleep(1);
}
pthread_join(t1,NULL);
pthread_join(t2,NULL);
return 0;
}
共享空间了,但是执行顺序可能不同
要使用锁,来让这个变量递增。