多线程(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;
}
相关推荐
代码之光_198012 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi18 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
萨格拉斯救世主32 分钟前
戴尔R930服务器增加 Intel X710-DA2双万兆光口含模块
运维·服务器
无所谓จุ๊บ34 分钟前
树莓派开发相关知识十 -小试服务器
服务器·网络·树莓派
Jtti35 分钟前
Windows系统服务器怎么设置远程连接?详细步骤
运维·服务器·windows
StayInLove37 分钟前
G1垃圾回收器日志详解
java·开发语言
TeYiToKu39 分钟前
笔记整理—linux驱动开发部分(9)framebuffer驱动框架
linux·c语言·arm开发·驱动开发·笔记·嵌入式硬件·arm
对许41 分钟前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
java·log4j
dsywws41 分钟前
Linux学习笔记之时间日期和查找和解压缩指令
linux·笔记·学习
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化