赞
踩
目录
学完了Linux进程线程,快来看看你会不会做这些题目吧!相信你独立做完这些题后会有很大的进步!每一题后面都有我做的答案,如果你有更好的也欢迎你在评论区讨论哦!!
假设有一个数组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;
-
- }
-
-
编写一个程序,创建一个子进程,并在子进程中执行一个命令,然后在父进程中等待子进程结束,并输出子进程的退出状态。
附上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;
- }
通过这两个实验,学到了什么?快来总结一下吧!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。