Linux线程

线程

1.1 线程概述

1.2 线程常用API

image

线程方法使用

创建线程

#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*)&param);

    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,这告诉链接器链接线程库。

image

验证共享变量

线程是共享进程的空间的,所以进程中的变量也是共享的,进行验证

写一个共享变量,然后每个线程都给这个变量加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 *)&param);
	if(ret == 0){
		printf("main:create t1 success\n");
	}

	ret = pthread_create(&t2, NULL, func2,(void *)&param);
	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;
}

image

共享空间了,但是执行顺序可能不同
要使用锁,来让这个变量递增。

posted @ 2024-11-14 16:38  拿受用  阅读(1)  评论(0编辑  收藏  举报