当前位置:   article > 正文

Linux进程线程编程练习题(附答案)_linux 有关于线程和进程的代码题

linux 有关于线程和进程的代码题

目录

实验1

实验2 


学完了Linux进程线程,快来看看你会不会做这些题目吧!相信你独立做完这些题后会有很大的进步!每一题后面都有我做的答案,如果你有更好的也欢迎你在评论区讨论哦!!

实验1

        假设有一个数组A长度为N,其中每个元素都是一个整数。请编写一个程序,创建M个线程,每个线程计算数组A的一个子数组的和,并把结果累加到一个全局变量S中。当所有线程结束后,主线程输出S的值。

附上pthread构造形式

  1. int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
  2. void *(*start_routine) (void *), void *arg);

------------------------------------------------------做题分割线-----------------------------------------------------------

答案:

  1. /*题目:假设有一个数组A,长度为N,其中每个元素都是一个整数。
  2. * 请编写一个程序,创建M个线程,
  3. * 每个线程计算数组A的一个子数组的和,并把结果累加到一个全局变量S中。
  4. * 当所有线程结束后,主线程输出S的值。*/
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <pthread.h>
  8. #include <stdlib.h>
  9. #define MaxSize 1000
  10. #define M 10
  11. int arr[MaxSize]; //定义数组大小,大小为1000
  12. int s = 0; // 数组总和
  13. pthread_mutex_t mutex; // 互斥锁
  14. void *thread_func(void *arg) {
  15. int id = *(int *)arg;// 注意参数传递
  16. int start = id * (MaxSize / M);
  17. int end = (id == M - 1) ? MaxSize : (id + 1) * (MaxSize / M); // 确定最后一个数
  18. int sum = 0;
  19. for(int i = start; i < end; i++) {
  20. sum += arr[i];
  21. }
  22. pthread_mutex_lock(&mutex);
  23. s+=sum;
  24. pthread_mutex_unlock(&mutex);
  25. }
  26. int main() {
  27. // 初始化数组,大小分别是1,2,...,1000
  28. for(int i = 0; i < MaxSize; i++) {
  29. arr[i] = i + 1;
  30. }
  31. // 创建10个线程
  32. pthread_t thread[M];
  33. int pid[M];// 线程id
  34. for(int i = 0; i < M; i++) {
  35. pid[i] = i;
  36. if(pthread_create(&thread[i], NULL, thread_func, &pid[i]) != 0) {
  37. perror("pthread_create");
  38. exit(1);
  39. }
  40. }
  41. // 等待所有线程结束
  42. for(int i = 0; i < M; i++) {
  43. if(pthread_join(thread[i], NULL) != 0) {
  44. perror("pthread_join");
  45. exit(0);
  46. }
  47. }
  48. // 最后输出结果
  49. printf("The sum of array is %d\n", s);
  50. return 0;
  51. }

实验2

        编写一个程序,创建一个子进程,并在子进程中执行一个命令,然后在父进程中等待子进程结束,并输出子进程的退出状态。

附上execl的构造形式

int execl(const char *pathname, const char*arg0, ...);

------------------------------------------------------做题分割线-----------------------------------------------------------

答案:

  1. /*题目:编写一个程序,创建一个子进程,并在子进程中执行一个命令,然后在父进程中等待子进程结束,并输出子进程的退出状态。*/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <sys/wait.h>
  6. int main() {
  7. pid_t pid = fork(); // 创建子进程
  8. if(pid == 0) { // 子进程
  9. execl("/bin/ls", "ls", "-l", NULL); //执行ls -l 命令
  10. perror("execl"); // 若execl函数返回,说明execl发生了错误
  11. exit(1);
  12. } else if(pid > 0) { // 父进程
  13. int status; // 等待的状态
  14. wait(&status); // 等待子进程结束
  15. if(WIFEXITED(status)) { // 如果子进程正常终止
  16. printf("Child process exited with status %d\n", WEXITSTATUS(status));
  17. } else {
  18. printf("Child process exited abnormally\n");
  19. }
  20. } else { // 如果fork失败
  21. perror("fork");
  22. exit(1);
  23. }
  24. return 0;
  25. }

小结

通过这两个实验,学到了什么?快来总结一下吧!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/462488
推荐阅读
相关标签
  

闽ICP备14008679号