여기에 내용의 일부이지만, 또한 변경합니다.
하나 : 목적과 내용
는 pthread 라이브러리 함수를 사용하여, 포크 () 간부 학습, 소스 코드를 판독 포크, 간부,는 pthread_create 기능의 메커니즘을 분석
코드 구현 :
프로세스는 자식 프로세스 B를 만들
부모 자식 프로세스 B와 A는 각각 서로 다른 실행 파일에 해당합니다 인쇄 안녕하세요 세계, B 누적 합계가 구현
B는 세 개의 프로세스 스레드를 가지고, 메인 쓰레드 (파라미터 X 1에서) 누적 합을 달성하는 새로운 스레드, 스레드 2 모니터 입력 변수 (X)를 생성
입력 x는 음이 아닌 정수, 카운트 스레드 일 경우, 스레드 1은 이전 프로그램, 입력 스레드 2 음이 아닌 정수 1을 다시 계산해야 마지막 스레드는 다른 계산하는 경우, 동일하게 재 계산하지 않으면
당신은 문자 p를 입력하면, 다음 1 개 스레드가 중단.
A와 B 출구의 전체 프로세스의 스레드 정보를 종료 한 후 문자 전자 (1) 인쇄를 입력
다른 문자를 입력하면, 스레드 1은 입력 오류를 인쇄 작업이 계속
실행 파일 실행의 각 등 기본 정보 프로세서 사용량, 메모리 사용량, 분석
두 단계
참고
리눅스 C 프로그래밍 --fork () 상세 - 장 진, A - CSDN 블로그
[동시 병렬] _ [pthread에] _ - 진정 - CSDN 블로그 [- 일시 정지 - 노동자의 간단한 제어 스레드 중지 - 계속]을
리눅스 멀티 태스킹 프로그래밍 (C) --- 기능과 기본적인 실험의 간부 인 가족 - 왕 좡어의 블로그 - CSDN 블로그
blankqdb - - 블로그 공원 리눅스 멀티 스레드 프로그래밍 및 여러 매개 변수 인스턴스를 전달
일시 중지 및 pthread와 스레드에 대한 논의 재개 - 하루 동안 작은 단계 - CSDN 블로그
요청의 주제는 두 가지 실행이 A와 B를 찾을 필요 첫 번째 A, 다음 B. 디자인의 모듈 형 설계 원칙
1. 절제, 묻는 질문에 따라, 프로세스 A에 대한 코드를 작성하는
#INCLUDE 제공 포크 () 때 execlp () 함수
#INCLUDE <SYS / wait.h> 제공된 대기 () 함수
#INCLUDE 된 pid_t의 유형의 정의를 제공
코드는 주로 자식 프로세스를 만들기 위해서, 자식 프로세스는 새로운 프로세스 이미지로 현재 프로세스 이미지를 대체 비교적 간단하다.
코드 뒤에 자식 프로세스 B를 적는다
모듈 식 설계 방식을 최대한 활용.
첫째, 헤더 파일
사용법 #include <pthread.h를>는 pthread 라이브러리 함수를 제공한다
리눅스는 기본 라이브러리는 pthread 없기 때문에 참고, 플러스 -lpthread GCC는 컴파일 시간
몇 전역 변수 후, 문제가 스레드 사이에 매개 변수를 전달을 줄일 수 있습니다.
1. 메인 스레드
함수는 두 개의 서브 - 스레드, 스레드 2 모니터링 입력, 스레드 1 인쇄 정보를 생성하고 누적 계산한다.
스레드 종료는 1, 2 황제 스레드가 종료가되면.
자식 스레드를 만들 수는 pthread_create 사용합니다.
실 끝을 기다리고 pthread_join을 사용하여
2. 스레드 2
스레드 (2) 입력을 모니터링, 그래서하기 때문에 첫 번째 스레드 (2)를 작성합니다.
스레드 2 부 :
주 처리 입력.
자세한 내용은 코드의 사진과 설명을 참조하십시오.
여기에 C ++ 사용되는 입력 문자열을 처리, 제한 입력 타입이 없기 때문에
스레드 2 파트 II :
FUNC는 입력 값에 따라 결정된다. 전역 변수로 스레드 1 FUNC 조정 상태
동시에 최근 칼과 다시 계산할지 여부를 결정합니다. 목표 축적 처의 최초부터 1 스레드이다.
스레드 2 제 3 부 :
스레드의 제 2 부분이 얻어 작동 상태에 따라 조정 한 FUNC.
FUNC의 == 2 pthread_join을 사용 ()는 에러 메시지, 종료를 차례로 인쇄 스레드 1 기다린다.
pthread_suspend () pthread_resume () 함수는 현탁 스레드를 달성하기 정의 자신의 함수이다. 상세한 설명의 구현을 일시 중단 실험 보고서의 다음 부분을 참조하십시오.
3. 스레드 1
첫 번째 부분은 : 스레드 1을 일시 정지합니다.
이용
에 pthread_mutex_lock () pthread_mutexunlock ()는 pthread_cond_wait (), 어떤 pthread_cond_broadcast ()는 스레드를 정지한다.
소스는 더 명확하게 구현 프로세스를 일시 중단 구현.
파트 II : 스레드 1은 출력 된 조작 정보를 축적
동작 두 입력이 동일한 다른 동작 설정을 반영하기 위해, P 자. 사람들이 컴퓨터가 아직 도착하지 않은 두 번째 입력으로 이어지는, 속도를 계산하여 입력 할 그렇지 않으면 속도가 좋지 않아, 우리는 마지막 결과에 올 수 있습니다.
요약하면, 다음과 같은 구조 B의 방법
pthread_suspend 보이드 (공극)
보이드 pthread_resume (냉혈한)
thread1 보이드 (공극 *의 ARG)
thread2 보이드 (공극 *의 ARG)
() 주요 int로
III. 실행 파일 실행의 각 등 기본 정보 프로세서 사용량, 메모리 사용량, 분석
터미널 A에서 실행중인 모든 프로세스의 우선
pgrep 是通过程序的名字来查询进程的工具,一般是用来判断程序是否正在运行。在服务器的配置和管理中,这个工具常被应用,简单明了;
然后打开另一个终端,pgrep -l A查看进程名和pid
pstree -p 26638。以树状图显示进程,并显示进程pid。可见父子进程和线程的关系。
ps -T -p 26639 可以查看进程B的线程信息。
使用top查看进程cpu和内存信息。
下图为示例:
top命令的第三行,cpu状态:
依次对应:
us:user 用户空间占用cpu的百分比
sy:system 内核空间占用cpu的百分比
ni:niced 改变过优先级的进程占用cpu的百分比
id:空闲cpu百分比
wa:IO wait IO等待占用cpu的百分比
hi:Hardware IRQ 硬中断 占用cpu的百分比
si:software 软中断 占用cpu的百分比
st:被hypervisor偷去的时间
top命令第四行,内存状态:
total,free ,used ,buff/cache
依次对应:物理内存总量,空闲内存总量,使用中的内存总量,缓冲内存量
进入top后,交互时,输入s,系统提示更改刷新间隔。输入0则不断刷新。
top -p 26638查看pid为26638的进程(即A)的信息
top -p - H 26639
top命令可以实时显示各个线程情况。要在top输出中开启线程查看,请调用top命令的“-H”选项,该选项会列出所有Linux线程。在top运行时,你也可以通过按“H”键将线程查看模式切换为开或关。
四 遇到的问题及解决:
1.编译时出现c++11标准库未定义错误,因为编译器使用的库版本不同。
解决:使用-l链接 stdc++
2. gcc编译时报错
解决:
在32位模式时,int 和指针类型变量都占32位在64位模式下,int占32位,指针变量占64位
3.如图
又是-lstdc++解决
五.实验结果记录:
执行程序A。程序A 父进程fork 出子进程,之后打印Hello, world!然后执行wait(),等待子进程结束。
子进程调用execlp,执行另一个执行体B。
执行体B中线程2开始监控输入。
输入15,是非负整数,之后线程1计算1累加到15.结果为120。120后跟着的15表明计算的是1-15累加。
输入16,是非负整数,之后线程1计算1累加到16.结果为136。136后跟着的16表明计算的是1-16累加。
输入18,之后输入20.线程2监控到由于20与18不同,故线程1不再进行1-18累加,而进行1-20累加。
输出210.
输入25,再输入25.线程2监控到25相同,不需要重新计算,打印信息“输入相同,不需要重新计算”。线程1计算第一个25,输出325.
输入afd。线程2监控,属于其他字符,线程1打印错误信息“input wrong”。
输入fg。线程2监控,属于其他字符,线程1打印错误信息“input wrong”。
输入p,线程1暂停执行。打印信息“pause”表明线程1已暂停。
输入123.线程2检测到是非负整数,先调用恢复函数解除线程1的暂停。之后打印信息“resume”表示线程1已经恢复。之后线程1执行1-123累加,输出7626.
输入e。线程2检测到要退出。之后线程1打印信息“A and B exited”表示主进程,子进程都要退出。之后主进程和子进程都退出。
结束。