环境准备 #
- 本文采用的操作系统是CentOS7
- 需要事先安装好gcc和g++环境,分别用来编译c和c++代码
安装命令如下[1] :
# 安装gcc
yum install gcc
#安装 g++
yum install gcc-c++
这里yum为centos的安装命令,Ubuntu的安装命令为apt-get。
进程实例 #
1.实例描述
首先在linux下编写一个应用程序,命名为an_ch2_1b。这个程序不断地输出如下行:
Those output come from child,[系统时间]
另外写一个应用程序,命名为an_ch2_1a。这个程序创建一个子进程,执行an_ch2_1b。
2.具体步骤
首先创建一个索引目录exer用来存放脚本代码,然后转到exer目录下,使用指令
cat > an_ch2_1b.cpp << EOF
来创建C++脚本文件,EOF表示在文件中输入EOF退出。
输入an_ch2_1b.cpp的代码如下:
#include <iostream>
#include <string>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
using namespace std;
string getTime() // 获取系统时间
{
time_t timep;
time(&timep);
char tmp[64];
strftime(tmp, sizeof (tmp), "%Y-%m-%d%H:%M:%S" ,localtime(&timep));
return tmp;
}
int main()
{
while ( true )
{
string tmn = getTime();
cout << "Those output come from child," << tmn << endl;
sleep(1); // 为了便于截屏使用sleep() 函数延迟输出
}
return 0;
}
编写完成之后就需要对源代码进行编译,输入如下指令进行编译
g++ an_ch2_1b.cpp -o an_ch2_1b.sh
(注意这里是cpp文件,所以需要用g++来编译,用gcc会报错),指令的意思是把an_ch2_1b.cpp文件编译为an_ch2_1b.sh可执行脚本文件,也可以编译为an_ch2_1b文件,去掉文件后缀。
然后输入ls命令,可以看到已经成功编译了源代码。
执行可执行文件,输入指令./an_ch2_1b.sh
an_ch2_1b.cpp文件创建好之后按照同样的步骤来创建an_ch2_1a.cpp文件。
an_ch2_1a.cpp的源代码如下:
#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <cstdio>
#include <stdlib.h>
using namespace std;
int main()
{
pid_t pid;
pid = fork();
if (pid == -1) cout << "fail to create" << endl;
else if (pid == 0) system( "./an_ch2_1b.sh" );
return 0;
}
同样,编译后执行脚本文件,效果如下图
程序会一直输出Those output come from child,[系统时间],用CTRL + C也没法关掉,因为这只能停止一个进程。所以需要用CTRL + D来停止整个终端。
线程实例 #
1.实例描述
编写一个控制台应用程序,程序中有一个共享的整型变量shared_var,初始值为0;创建一个线程并使其立即与主线程并发执行。新创建的线程与主线程均不断地循环,并输出shared_var 的值。
主线程在循环中不断地对shared_var 进行加1操作,即每次循环shared_var 被加1;而新创建的线程则不断地对shared_var 进行减1 操作,即每次循环shared_var 被减1。
2.具体步骤
步骤和上面类似,只不过是用C语言来编写这个程序。创建Consoleapp.c 文件,写入代码如下:
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int shared_var = 0;
void * thread( void * arg )
{
while (1)
{
printf( "in the thread shared_var:%d\n" , --shared_var);
}
}
int main()
{
pthread_t pt;
int ret = pthread_create(&pt, NULL, ( void *)thread, NULL);
if (ret != 0) printf( "fail to create thread\n" );
while (1)
{
printf( "in the main shared_var:%d\n" , ++shared_var);
}
pthread_join(pt, NULL);
return 0 ;
}
编译源代码,这里要用gcc来编译,不能用g++,另外由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数:
gcc Consoleapp.c -lpthread -o Consoleapp.sh
执行脚本,观察效果:
可以看到整个程序运行过程中公共变量的值始终在增大,并且数字是连续的,说明另外一个现成并没有抢到过CPU资源,这是因为时间太短了,加上CPU的运算速度很快,所以看不到另一个线程作用的效果。等待程序运行一段时间之后观察输出情况就能看出并发了,如下图:
同时也可以在原来的主线程打印之后的代码中加入一行代码
pthread_yield(NULL)
可以让线程主动释放CPU来运行另一个线程,这样就可以观察到数字递减的情况,如下图:
参考 #
- ^ https://blog.csdn.net/analogous_love/article/details/97823301
Last modified on 2021-04-22