文章目录
一、实验目的
要求熟悉Linux环境中的程序编译、调试与项目管理过程并能实现具体操作;熟练使用基础函数库中与线程库中的管理函数,实现用户线程编程过程,并深入了解Linux的线程管理机制。
二、实验要求
通过这个第四阶段实验,要求掌握以下操作与相关知识:
(一)Linux中C/C++程序的编译运行环境及操作;
(二)Linux中Java程序的编译运行环境及操作;
(三)了解和熟悉C/C++函数库;
(四)掌握Linux线程管理机制与线程编程过程。使用用户线程库的管理函数实现用户级线程编程。
(五)掌握进程创建过程并熟悉进程间通信的实现。
三、实验内容
🌟(1)编写一个或相关几个C/C++代码文件,并使用gcc/g++实现编译;运行相应的可执行程序。
$sudo apt install g++
$touch test.cpp
$vi test.cpp
#内容如下
$g++ -o test test.cpp #其中 -o 参数用于指定输出的可执行文件的文件名,这里将其命名为 test。
🌟(2)编写一个或相关几个Java代码文件,并使用javac实现编译,使用java运行相应的可执行程序。
$sudo apt install openjdk-11-jdk
$java -version
$touch hello.java
$vi hello.java
#内容如下
$javac hello.java
$java Hello
🌟(3)列出用户线程库信息,以及主要的线程管理函数。
在 Linux 系统中,用户线程库 (User-level Thread Library) 主要用于实现用户级线程调度,可以比较灵活地创建、销毁和管理线程。常见的用户线程库包括pthread 库、NPTL 库等,它们都提供了一些常用的线程管理函数。以下是一些主要的线程管理函数:
pthread_create()
pthread_create() 函数用于创建一个新线程,其原型如下:
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg);
其中,thread 参数是指向新线程 ID 的指针,并用于标识新线程;attr 参数是指向 pthread_attr_t 结构体类型的指针,用于设置新线程的属性;start_routine参数是新线程要执行的函数;arg 参数是传递给 start_routine 函数的参数。
pthread_join()
pthread_join() 函数用于等待一个线程结束并回收该线程占用的资源,其原型如
下:
int pthread_join(pthread_t thread, void **retval);
其中,thread 参数指定要等待的线程 ID;retval 参数是指向存储退出状态值的地址,如果不关心线程的退出状态,可以将该参数设置为 NULL。
pthread_exit()
pthread_exit() 函数用于终止当前线程的执行,并返回一个值,其原型如下:
void pthread_exit(void *retval);
其中 retval 参数是线程退出时返回的值。
pthread_cancel()
pthread_cancel() 函数用于取消另一个线程,其原型如下:
int pthread_cancel(pthread_t thread);
其中,thread 参数为要取消的线程 ID。
pthread_mutex_lock() 和 pthread_mutex_unlock()
这两个函数分别用于加锁和解锁互斥锁,避免资源竞争。其原型如下:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_unlock(pthread_mutex_t *mutex);
其中,mutex 参数为互斥锁的指针。
pthread_cond_wait() 和 pthread_cond_signal()
这两个函数分别用于等待条件变量和发送条件信号。其原型如下:
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_signal(pthread_cond_t *cond);
其中,cond 参数为条件变量的指针;mutex 为互斥锁的指针
🌟(4)设计一个程序实例(可列出全部代码或程序功能与主要函数),编写用户线程,并实现运行。
$touch thread_demo.c
$vi thread_demo.c
#内容如下
$gcc -o thread_demo thread_demo.c -lpthread
$./thread_demo
🌟(5)创建一个进程,并使之成为后台进程。
$touch fork.cpp
$vi fork.cpp
#内容如下
$gcc -o fork fork.cpp
$./fork
🌟(6)创建一个子进程,并实现与父进程的通信。
①知识点
②示例
$touch pipe.cpp
$vi pipe.cpp
#内容如下
$g++ -o pipe pipe.cpp
$./pipe
四、实验报告要求
(一)认真撰写实验报告;
(二)进行客观的个人评定。