b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Step by Step:Linux C多线程编程入门(基本API及多线程的同步与互斥)

电脑杂谈  发布时间:2019-06-18 09:11:42  来源:网络整理

线程编程主进程_posix线程编程指南 pdf_多线程编程

线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。 一个进程可以有很多线程多线程编程,每条线程并行执行不同的任务。

线程可以提高应用程序在多核环境下处理诸如文件I/O或者socket I/O等会产生堵塞的情况的表现性能。在Unix系统中,一个进程包含很多东西,包括可执行程序以及一大堆的诸如文件描述符地址空间等资源。在很多情况下,完成相关任务的不同代码间需要交换数据。如果采用多进程的方式,那么通信就需要在用户空间和内核空间进行频繁的切换,开销很大。但是如果使用多线程的方式,因为可以使用共享的全局变量,所以线程间的通信(数据交换)变得非常高效。

线程创建函数包含四个变量,分别为: 1. 一个线程变量名,被创建线程的标识 2. 线程的属性指针,缺省为NULL即可 3. 被创建线程的程序代码 4. 程序代码的参数 For example: - pthread_t thrd1; - pthread_attr_tattr; - void thread_function(voidargument); - char *some_argument;

pthread_create(&thrd1, NULL, (void *)&thread_function, (void *) &some_argument);

在新进程中调用pthread_exit(3)函数,在这个函数中指定的退出状态能被同进程中的其它线程调用pthread_join(3)函数获得,类似。主要用于终止正在运行的线程,通过参数 retval 来带出线程的退出状态信息,在同一个进程中的其他线程可以通过调用 pthread_join 函数来获取退出状态信息。如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。

pthread_create调用成功以后,新线程和老线程谁先执行,谁后执行用户是不知道的,这一块取决与操作系统对线程的调度,如果我们需要等待指定线程结束,需要使用pthread_join函数,这个函数实际上类似与多进程编程中的waitpid。 举个例子,以下假设 A 线程调用 pthread_join 试图去操作B线程,该函数将A线程阻塞,直到B线程退出,当B线程退出以后,A线程会收集B线程的返回码。 该函数包含两个参数:

调用实例:pthread_join(thrd1, NULL);

posix线程编程指南 pdf_多线程编程_线程编程主进程

 1 /*************************************************************************
 2     > File Name: thread_hello_world.c 
 3     > Author: couldtt(fyby)
 4     > Mail:  fuyunbiyi@gmail.com
 5     > Created Time: 2013年12月14日 星期六 11时48分50秒
 6  ************************************************************************/
 7 
 8 #include <stdio.h>
 9 #include <stdlib.h>
10 #include <pthread.h>
11 
12 void print_message_function (void *ptr);
13 
14 int main()
15 {
16     int tmp1, tmp2;
17     void *retval;
18     pthread_t thread1, thread2;
19     char *message1 = "thread1";
20     char *message2 = "thread2";
21 
22     int ret_thrd1, ret_thrd2;
23 
24     ret_thrd1 = pthread_create(&thread1, NULL, (void *)&print_message_function, (void *) message1);
25     ret_thrd2 = pthread_create(&thread2, NULL, (void *)&print_message_function, (void *) message2);
26 
27     // 线程创建成功,返回0,失败返回失败号
28     if (ret_thrd1 != 0) {
29         printf("线程1创建失败\n");
30     } else {
31         printf("线程1创建成功\n");
32     }
33 
34     if (ret_thrd2 != 0) {
35         printf("线程2创建失败\n");
36     } else {
37         printf("线程2创建成功\n");
38     }
39 
40     //同样,pthread_join的返回值成功为0
41     tmp1 = pthread_join(thread1, &retval);
42     printf("thread1 return value(retval) is %d\n", (int)retval);
43     printf("thread1 return value(tmp) is %d\n", tmp1);
44     if (tmp1 != 0) {
45         printf("cannot join with thread1\n");
46     }
47     printf("thread1 end\n");
48 
49     tmp2 = pthread_join(thread1, &retval);
50     printf("thread2 return value(retval) is %d\n", (int)retval);
51     printf("thread2 return value(tmp) is %d\n", tmp1);
52     if (tmp2 != 0) {
53         printf("cannot join with thread2\n");
54     }
55     printf("thread2 end\n");
56 
57 }
58 
59 void print_message_function( void *ptr ) {
60     int i = 0;
61     for (i; i<5; i++) {
62         printf("%s:%d\n", (char *)ptr, i);
63     }
64 }

程序中都会引用库api,比如每个c程序都要引用stdio.h库的printf(),在程序运行时,库代码也要被加入到内存,这么多程序都引用了这个库,难道我内存中需要加很多份吗。需要先从16进制转换成10进制,不过也可以写死在代码里。键盘中输入或者从源文件中读入需要编码的源文,然后将源文根据哈弗曼树的权值,译码为二进制代码。

运行结果结果分析: 1.这段程序我运行了两次,可以看到,两次的运行结果是不一样的,从而说明,新线程和老线程谁先执行,谁后执行用户是不知道的,这一块取决与操作系统对线程的调度。 2.另外多线程编程,我们看到,在thread2的join结果出现了错误,打印出cannot join with thread2其实这个是个小错误,因为,我pthread_join传进去的th是thread1,在上面的结果中,thread1早已经结束了,所以我们再次等待thread1结束肯定会出现无法取到状态的错误的。 3.pthread_join(thread1, &retval)确实等待了thread1的结束,我们看到,在print_message_function函数循环了5遍结束以后,才打印出thread1 end

7、 线程的同步、如何实现线程的同步答:当两个或多个线程同时访问同一个变量,并且以个线程需要修改这个变量。一个对象为了设计需要,比如services对象,可能需要创建新的工作线,并且新建线程会访问对象的成员变量.这时要特别注意对象的销毁,否则很容易访问非法内存.因为存在这种情况,使用者把该对象delete后,并没有通知线程结束,或者先于线程销毁了对象,线程可能继续运行,并且访问该实例对象,导致非法内存访问(access violation).。这种变量在多线程环境下访问时(通过get或set方法访问)时,能保证各个线程里的变量独立于其他线程内变量之外。

在编译时初始化锁为解锁状态

访问对象时的加锁操作与解锁操作

我们先来看一个不加锁,多个线程访问同一段数据的程序。

多线程编程_posix线程编程指南 pdf_线程编程主进程

 1 /*************************************************************************
 2     > File Name: no_mutex.c
 3     > Author: couldtt(fyby)
 4     > Mail: fuyunbiyi@gmail.com
 5     > Created Time: 2013年12月15日 星期日 17时52分24秒
 6  ************************************************************************/
 7 
 8 #include <stdio.h>
 9 #include <stdlib.h>
10 #include <pthread.h>
11 
12 int sharedi = 0;
13 void increse_num(void);
14 
15 int main(){
16     int ret;
17     pthread_t thrd1, thrd2, thrd3;
18 
19     ret = pthread_create(&thrd1, NULL, (void *)increse_num, NULL);
20     ret = pthread_create(&thrd2, NULL, (void *)increse_num, NULL);
21     ret = pthread_create(&thrd3, NULL, (void *)increse_num, NULL);
22 
23     pthread_join(thrd1, NULL);
24     pthread_join(thrd2, NULL);
25     pthread_join(thrd3, NULL);
26 
27     printf("sharedi = %d\n", sharedi);
28 
29     return 0;
30 
31 }
32 
33 void increse_num(void) {
34     long i,tmp;
35     for(i=0; i<=100000; i++) {
36         tmp = sharedi;
37         tmp = tmp + 1;
38         sharedi = tmp;
39     }
40 }


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-106820-1.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 汪梦斗
      汪梦斗

      至少还要几十年时间吧

    • 王玉红
      王玉红

      扔股市是血本无归

    • 增田俊树
      增田俊树

      对于没有加入公约的美国

    热点图片
    拼命载入中...