多线程(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;
}
相关推荐
m0_748247805 分钟前
SOA(面向服务架构)全面解析
java·微服务·架构
m0_740154678 分钟前
Tomcat
java·tomcat
爱敲代码的小冰15 分钟前
【Excel】 Power Query抓取多页数据导入到Excel
android·java·excel
心流时间29 分钟前
[Java基础] JVM常量池介绍(BeanUtils.copyProperties(source, target)中的属性值引用的是同一个对象吗)
java·开发语言·jvm
lqlj223335 分钟前
Linux常用命令
linux·运维·服务器
瑞金彭于晏1 小时前
通俗易懂版 Maven 科普,maven是什么?
java·maven
好看资源平台1 小时前
Java Web开发实战与项目——Spring Boot与Spring Cloud微服务项目实战
java
obboda1 小时前
使用haproxy实现MySQL服务器负载均衡
服务器·mysql·负载均衡
.猫的树1 小时前
Java集合List快速实现重复判断的10种方法深度解析
java·开发语言·list·集合
littlegirll1 小时前
命令行方式安装KFS同步KES到KADB
java·大数据·数据库