Linux下多线程编程之——线程竞争

一、多线程竞争域

  1、函数pthread_attr_setscope()和函数pthread_attr_getscope()用来设置和获取线程的作用域,作用域决定线程是在进程内还是在系统内竞争资源,linux下只能设置为:PTHREAD_SCOPE_SYSTEM

二、代码test7_6.c

 1 //This is c program code!                                                                                                                      
 2 /* *=+=+=+=+* *** *=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
 3   * 文档信息: *** :~/test7_6.c
 4   * 版权声明: *** :(魎魍魅魑)MIT
 5   * 联络信箱: *** :guochaoxxl@163.com
 6   * 创建时间: *** :2020年11月17日的下午08:49
 7   * 文档用途: *** :数据结构与算法分析-c语言描述
 8   * 作者信息: *** :guochaoxxl(http://cnblogs.com/guochaoxxl)
 9   * 修订时间: *** :2020年第46周 11月17日 星期二 下午08:49 (第322天)
10   * 文件描述: *** :自行添加
11  * *+=+=+=+=* *** *+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+*/
12 #include <stdio.h>
13 #include <pthread.h>
14 #include <errno.h>
15 
16 void *myComadd(void *iData){
17     int sum = 0;
18     int *data = (int *)(iData);
19     int contScope; 
20     pthread_attr_t attr;
21     pthread_getattr_np(pthread_self(), &attr);
22     pthread_attr_getscope(&attr, &contScope);
23     
24     if(contScope == PTHREAD_SCOPE_SYSTEM){
25         printf("myComadd系统竞争!\n");
26     }
27     if(contScope == PTHREAD_SCOPE_PROCESS){
28         printf("myComadd进程竞争!\n");
29     }
30 
31     for(int i = 0; i < *data; i++){
32         sum += i;
33     }
34     
35     printf("add %d\n", sum);
36 }
37 
38 void *myCommul(void *iData){
39     int sum = 1;
40     int *data = (int *)(iData);
41     int contScope;
42     pthread_attr_t attr;
43     pthread_getattr_np(pthread_self(), &attr);
44     pthread_attr_getscope(&attr, &contScope);
45     
46     if(contScope == PTHREAD_SCOPE_SYSTEM){
47         printf("myComadd系统竞争!\n");
48     }
49     if(contScope == PTHREAD_SCOPE_PROCESS){
50         printf("myComadd进程竞争!\n");
51     }
52 
53     for(int i = 1; i <= *data; i++){
54         sum *= i;
55     }
56 
57     printf("mul %d\n", sum);
58 }
59 
60 int main(int argc, char **argv)
61 {
62     int n = 5;
63     pthread_t threadA;
64     pthread_t threadB;
65     pthread_attr_t attr;
66     pthread_attr_init(&attr);
67 
68     pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);                                                                                        
69     if(pthread_attr_setscope(&attr, PTHREAD_SCOPE_PROCESS) == ENOTSUP){
70         printf("Linux系统不支持系统调度竞争\n");
71     }
72 
73     pthread_create(&threadA, NULL, myComadd, &n);
74     pthread_create(&threadB, &attr, myCommul, &n);
75 
76     sleep(1);
77 
78     return 0;
79 }   

 

  代码很简单,不做说明!

 

posted @ 2020-11-18 22:02  叕叒双又  阅读(455)  评论(0编辑  收藏  举报