目录
学完了Linux进程线程,快来看看你会不会做这些题目吧!相信你独立做完这些题后会有很大的进步!每一题后面都有我做的答案,如果你有更好的也欢迎你在评论区讨论哦!!
实验1
假设有一个数组A,长度为N,其中每个元素都是一个整数。请编写一个程序,创建M个线程,每个线程计算数组A的一个子数组的和,并把结果累加到一个全局变量S中。当所有线程结束后,主线程输出S的值。
附上pthread构造形式
int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
------------------------------------------------------做题分割线-----------------------------------------------------------
答案:
/*题目:假设有一个数组A,长度为N,其中每个元素都是一个整数。
* 请编写一个程序,创建M个线程,
* 每个线程计算数组A的一个子数组的和,并把结果累加到一个全局变量S中。
* 当所有线程结束后,主线程输出S的值。*/
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <stdlib.h>
#define MaxSize 1000
#define M 10
int arr[MaxSize]; //定义数组大小,大小为1000
int s = 0; // 数组总和
pthread_mutex_t mutex; // 互斥锁
void *thread_func(void *arg) {
int id = *(int *)arg;// 注意参数传递
int start = id * (MaxSize / M);
int end = (id == M - 1) ? MaxSize : (id + 1) * (MaxSize / M); // 确定最后一个数
int sum = 0;
for(int i = start; i < end; i++) {
sum += arr[i];
}
pthread_mutex_lock(&mutex);
s+=sum;
pthread_mutex_unlock(&mutex);
}
int main() {
// 初始化数组,大小分别是1,2,...,1000
for(int i = 0; i < MaxSize; i++) {
arr[i] = i + 1;
}
// 创建10个线程
pthread_t thread[M];
int pid[M];// 线程id
for(int i = 0; i < M; i++) {
pid[i] = i;
if(pthread_create(&thread[i], NULL, thread_func, &pid[i]) != 0) {
perror("pthread_create");
exit(1);
}
}
// 等待所有线程结束
for(int i = 0; i < M; i++) {
if(pthread_join(thread[i], NULL) != 0) {
perror("pthread_join");
exit(0);
}
}
// 最后输出结果
printf("The sum of array is %d\n", s);
return 0;
}
实验2
编写一个程序,创建一个子进程,并在子进程中执行一个命令,然后在父进程中等待子进程结束,并输出子进程的退出状态。
附上execl的构造形式
int execl(const char *pathname, const char*arg0, ...);
------------------------------------------------------做题分割线-----------------------------------------------------------
答案:
/*题目:编写一个程序,创建一个子进程,并在子进程中执行一个命令,然后在父进程中等待子进程结束,并输出子进程的退出状态。*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main() {
pid_t pid = fork(); // 创建子进程
if(pid == 0) { // 子进程
execl("/bin/ls", "ls", "-l", NULL); //执行ls -l 命令
perror("execl"); // 若execl函数返回,说明execl发生了错误
exit(1);
} else if(pid > 0) { // 父进程
int status; // 等待的状态
wait(&status); // 等待子进程结束
if(WIFEXITED(status)) { // 如果子进程正常终止
printf("Child process exited with status %d\n", WEXITSTATUS(status));
} else {
printf("Child process exited abnormally\n");
}
} else { // 如果fork失败
perror("fork");
exit(1);
}
return 0;
}
小结
通过这两个实验,学到了什么?快来总结一下吧!