多线程(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;
}
相关推荐
不负岁月无痕12 小时前
简单理解操作系统结构
java·linux·c语言·开发语言·c++·面试
mister_guo12 小时前
Java线程池参数应该如何设置(ThreadPoolExecutor)
java
余额瞒着我当琳12 小时前
C++模板初阶与STL初探
android·java·c++
淡海水13 小时前
15-02-YooAsset面试篇-Unity架构设计与源码
java·unity·面试·c#·游戏引擎·yooasset
weixin_BYSJ198713 小时前
springboot酒店管理系统--附源码27436
java·spring boot·python·随机森林·贪心算法·eclipse·django
2401_8949155313 小时前
GEO 源码部署如何实现精准地域分发?核心配置参数深度讲解
java·运维·服务器·后端·开源
Zguigo13 小时前
第25-26讲:计算机操作系统存储管理——分页机制、页表与快表(TLB)
linux·windows·笔记
常乐か14 小时前
VMware Workstation Pro 17 搭建 Ubuntu 24.04 完整指南
linux·运维·ubuntu
evans在进步15 小时前
LeetCode 2 两数相加:链表模拟加法,Java 图解进位过程
java·leetcode·链表
2401_8582861115 小时前
OS82.【Linux】设计线程池
java·linux·运维·服务器·开发语言·算法·线程池