多线程(1)

1、wait 函数

宏定义:WIFEXITED() WEXITSTATUS()

调用进程 一般不做额外的事情

复制代码
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>

int main(int argc, const char *argv[])
{
	pid_t pid = fork();

	if (-1 == pid)
	{
		perror("fork fail");
		return -1;
	}
	if (pid > 0)
	{
		int status;
		printf("father ----\n");
		wait(&status);
		printf("status = %d\n",status);

		if (WIFEXITED(status))
		{
			printf("status = %d\n",WEXITSTATUS(status));
		}

	}else if (pid == 0)
	{
		printf("child exit \n");
		exit(256);
	}	
	return 0;
}

2、waitpid 函数

调用进程 逻辑一般不受影响

注意:waitpid 想要处理到子进程必须套在循环中

3、pthread_库函数

(1)创建线程

(2)获取线程的tid

(3)pthread_join函数:等待线程结束

创建结束线程

复制代码
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>

void * do_something(void *arg)
{
	static int a = 10;
	//线程的任务函数 
	printf("------do_something ---- \n");

	//pthread_exit(NULL);
	pthread_exit(&a);
	//pthread_exit((void *)a);
}

int main(int argc, const char *argv[])
{
	pthread_t tid;
	int ret = pthread_create(&tid,NULL,do_something,NULL);

	if (ret != 0)
	{
		errno = ret;
		perror("pthread_create fail");
		return -1;
	}

	//sleep(3);
   void *retval; 
	//pthread_join(tid,&retval);
	pthread_join(tid,&retval);


	printf("---- main----%d\n",*(int *)retval);
//	printf("---- main----%d\n",(int)retval);

	pthread_exit(NULL);

	return 0;
}

#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <unistd.h>

void * do_something1(void *arg)
{
	int *p = arg;
	//((int)(*arg))+=1;
	int a = *p;
	while (1)
	{
		//线程的任务函数 
		printf("------do_something1 ---- tid = %ld a = %d\n",pthread_self(),a++);
		sleep(1);
	}
}

void * do_something2(void *arg)
{
	int *p = arg;
   //线程的任务函数 
   int a = *p;
   while (1)
   {
	   a += 2;
		printf("------do_something2 ---- tid = %ld a = %d\n",pthread_self(),a);
		sleep(1);
   }
}

int main(int argc, const char *argv[])
{
	int a = 10;

	pthread_t tid1;
	int ret = pthread_create(&tid1,NULL,do_something1,&a);

	if (ret != 0)
	{
		errno = ret;
		perror("pthread_create fail");
		return -1;
	}

	pthread_t tid2;
	ret = pthread_create(&tid2,NULL,do_something2,&a );

	if (ret != 0)
	{
		errno = ret;
		perror("pthread_create fail");
		return -1;
	}

   //main do something 

	while (1)
	{
		printf("----main-----do_something--tid = %ld-\n",pthread_self());
		sleep(1);
	}


	sleep(3);
	
	return 0;
}
相关推荐
市场部需要一个软件开发岗位1 分钟前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
忆~遂愿5 分钟前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
MZ_ZXD00110 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东13 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology18 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble22 分钟前
springboot的核心实现机制原理
java·spring boot·后端
人道领域30 分钟前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
大模型玩家七七1 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
珠海西格电力科技1 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
A星空1231 小时前
一、Linux嵌入式的I2C驱动开发
linux·c++·驱动开发·i2c