c语言-关于线程的几个问题,望大神不吝赐教

问题描述

关于线程的几个问题,望大神不吝赐教

1、双线程,对一个公共区间读写时,需要加锁,即一个线程“写”完后再由另一个线程“读”,不断循环。那这种方式与另外一种方式有什么区别:在一个main函数中写一个(死)循环,循环内先安排“写”程序,再安排“读”程序,不使用线程。

2、做TCP全双工通信时(例如语音对话),发送和接收数据在分别用一个线程实现,两个线程没有公共区间。那这种方式和另外一种区别有什么不同:在一个main函数中写一个(死)循环,循环内先安排“发”程序,再安排“收”程序,不使用线程。

3、c语言中,线程创建用pthread_create,此要传输参数时用最后一个参数。问题是:如果要传多个参数时,可以用结构体,但也可以把参数设成全局变量,这两种方式又有什么不同。

以上3个问题,每种情况都是可以实现的,我想请教的是他们之间的区别,望大神们不吝赐教,感谢!

解决方案

第一点:如果是两个线程,那么在有互斥锁的情况下,一个线程A先获得资源,当他的操作没有完成是,另一个线程B想要去获得资源,这个时候B就会被挂起,相当于睡觉了,具体的系统机制有点复杂,涉及到CPU时间片,进程内线程的切换。如果是一个MAN函数,里面有两个子函数,一个读一个写,MAN按顺序调用它。那么在相当于是单线程。宏观上看,两种情况的结果差距不大,但是机制不同。同时要考虑的是,第一种情况存在写的线程写多次,或者读的线程读多次,另一个线程才去访问资源的情况。第二种就完全是按程序逻辑去做。
第二点:如果是两个线程分别负责收发,那么和一个线程即收又发比较起来,肯定是两个线程的速度要快。因为在实际应用中,很可能你读写会阻塞,如果在一个线程里面阻塞了,那么可能会丢失一些信息,比方你在发送的时候阻塞了,但是对端的信息不断地到达本地,那么接受缓冲区的数据满了之后,如果还有数据到达,那么就会覆盖之前的数据。分两个线程的话,当收或者发通道阻塞之后,另一个通道还是好的,就会比较好处理。
第三点:两种方法的结果没有区别,但是根据应用的情况有区别,全局变量是所有的都可以访问的,而有时候,你的变量是个局部的,没法设成全局,那你就需要在创建线程的时候,把这个变量通过参数传入的方式传入线程。

解决方案二:

线程有系统内核线程与用户线程之分。
每一个系统内核线程对应一个逻辑CPU,由操作系统进行统一调度;
用户线程实际上只对应一个逻辑CPU,在线程内部进行多任务切换,每个任务必须及时释放CPU,将时间片让给其他的任务。操作系统对此并不知情。
详见Windows的“线程”和“纤程”这两个不同的概念。

解决方案三:

关于线程的几个问题

解决方案四:

1.你读写是有目的的啊,你在一个线程里读写一段数据,玩儿呢
2.全局变量和局部只是存放位置的区别,

解决方案五:

就是资源消耗多少的问题

时间: 2024-10-01 11:26:10

c语言-关于线程的几个问题,望大神不吝赐教的相关文章

c语言-linux C 线程终止问题,着急,求各位大神帮忙

问题描述 linux C 线程终止问题,着急,求各位大神帮忙 include #include #include static int run = 1; static int retvalue; void *start_routine(void *arg){ int *runing = arg; printf("The child thread has been inited,the arg is: %dn",*runing); while(*runing){ printf("

printf-c语言的一道题 动态规划 新手,求大神看看我代码的问题

问题描述 c语言的一道题 动态规划 新手,求大神看看我代码的问题 描述 7 3 8 8 1 0 2 7 4 4 4 5 6 2 5 (图1) 图1显示了一个三角形数. 编写一个程序,计算最高金额的数字传递路线,从顶部开始和结束的地方固定在底座上. 每一步可以走斜向下向左或向右斜下. 输入 程序从标准输入读取. 第一行包含一个整数N:三角形的行数. 以下N行描述三角形的数据. 在三角形的行数> 1但< = 100. 三角形的数量,所有的整数,在0到99之间. 输出 你的程序是编写到标准输出. 最

出现频率-一道C语言编程题,本人初学者,求大神解答

问题描述 一道C语言编程题,本人初学者,求大神解答 编写程序实现功能:数据文件story.txt是一篇英文小故事,请先统计其中26个字母的出现次数. 要求一:再根据用户要求,输出某个字母的出现次数,直到用户输入#为止. 要求二:请输出出现频率最高的三个字母和它们的出现次数. 解决方案 #include #include #include int main() { int alpha[26]={0}; //用于计数26个字母出现的次数 FILE *text; //FILE 指针 char ch;

求大神来解决-C语言算法问题,矩阵排序。求大神

问题描述 C语言算法问题,矩阵排序.求大神 一个N*N的矩阵,现在求一个高效的算法.例如一个3*2的矩阵,将矩阵中某个元素的值变为他在矩阵中所有元素的有大到小排序的位置(序号,比如图中元素7的值最大,所以就让他变为1).现在有3W*3W=9亿的矩阵,怎么处理最高效,基本算法就不要说了,现在就是要解决算法不够高效的问题.谁有好的思路可以提一下么?求大神 解决方案 这就是一个最简单的排序问题,数据用二维数组装的.别被矩阵唬住了.排序问题的算法已经被研究烂了,教材里有的是,我就不赘述了 解决方案二:

编程问题 C C#语言 最好能给出代码,求大神!

问题描述 编程问题 C C#语言 最好能给出代码,求大神! 1.从键盘接受两个任意正整数,要求第一个正整数必须小于第二个正整数,然后把这两个数范围内(包括这两个数)的所有偶数分解为两个素数之和,并输出每个偶数以及对应的两个素数. 2.编写程序,将输入的一行字符串加密.加密时,每个字符的ASCII码依次反复加上密码表4,9,6,2,5,7,3中对应的数字. 如果相加的结果超过字符Z的ASCII码122,则进行取模运算.加密与解密的顺序相反,要求编写加密和解密两个函数, 输出各个过程的结果. 如输入

c语言-C语言的这个代码表达不了,大神帮忙看看。

问题描述 C语言的这个代码表达不了,大神帮忙看看. #include #define N 50 //学生人数 #define M 3 //课程门数 void Input(int score[][M+3], int n); { int i, j, sum; printf("Input Number and %d score:n",M); for (i = 0; i < n; i++) { sum = 0; printf("%d:",i+1); for (j =

c语言代码问题,有疑问,求大神解释

问题描述 c语言代码问题,有疑问,求大神解释 这个function的机理是什么? 为什么第二个循环只有分号...有什么作用 求大神解释 char *mystery( char *a, char *b ) { char *c = a; while ( *c != '' ) { c++; } while (( *c++ = *b++ ) != '' ) ; return a; } 解决方案 第一个循环,c指向了a字符串的末尾: 第二个循环,把b指向的字符串拷贝到a字符串后面了. 解决方案二: 求大神

c语言-问大神们一个C语言蓝桥杯的问题,跪求大神啊

问题描述 问大神们一个C语言蓝桥杯的问题,跪求大神啊 加法变乘法 我们都知道:1+2+3+ ... + 49 = 1225 现在要求你把其中两个不相邻的加号变成乘号,使得结果为2015 比如: 1+2+3+...+10*11+12+...+27*28+29+...+49 = 2015 就是符合要求的答案. 请你寻找另外一个可能的答案,并把位置靠前的那个乘号左边的数字提交(对于示例,就是提交10). 注意:需要你提交的是一个整数,不要填写任何多余的内容. #include "stdio.h&quo

编程c语言-计算输入字符串的空格数有错,希望大神不吝赐教

问题描述 计算输入字符串的空格数有错,希望大神不吝赐教 #include int main() { int i,t=0; char a[100]; printf("please enter 字母:n"); gets(a); for(i=0;a[i]!='';i++) { if(a[i]=='32') //32是空格的ascall码 t++; } printf("空格个数为:%dn",t); return 0; } 解决方案 既然是用ascii码判断,直接判断a[i]