Unix C多线程编程 线程间变量覆盖问题

Unix C多线程编程 线程间变量覆盖问题,第1张

变量不会自己被覆盖槐大洞,这种情况多数是内存溢出导致污染了其他线程

第二个问题,贴上我以前对这个问题的回答:

C99标准之前是不可以这么声明数组的,但是C99开始引入了变长数组这一概念,也就是铅枯使用变量定义数组各维,也就是你可以用 int a[x]这种方式定义数组,x的值无需是常量,但是有几个主要限制:

1:必须在函数内部声明或者是函数参数(也就是必须在存储在栈区),也不能是成员变量

2:不能在声明的同时初始化

3:不能是静态变量或用extern修饰

4:数组的类型以及长度的类型都必须支持sizeof(一般来说就是只能用内部类型)

大部分支持C99的编译器都支持这个特性(VC2005之后,GCC3.2之后),这个和new出来的数组还是本质上不一样的,这个其实是程序在运行期间在进程栈区生成定长数组,仿旁所以也不需要你手动释放,但这种做法对一些高级的调试方法可能有一定的影响

我刚刚写了个LINUX下多线程的程序,满足你上面辩让的要求,请参考:

在客户端创建3个线程携肢局A B C,A线程随机产生一个整数,B线程随机产生一个大写字母,C线程随机产生一个小写字母。客户端有3个线程ABC,服务端饥塌创建一个线程来接收,接收的内容放在队列里。在红旗LINUX下。

IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。

如果是UNIX/linux环境,采用多线程没必要。

多线程比多进程性能高?误导!

应该说,多线程比多进程成本低,但性能更低。

在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。

多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。

多线程是平面交通系统,造价低,但红绿灯太多,老堵车。

我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。

团蠢高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考塌歼陪意义。

多线程的优点:

无需跨进程边界;

程序逻辑和控制方式简单;

所有线程可以直接共享内存和变量等;

线程方式消耗的总资源比进程方式好;

多线程缺点:

每个线程与主程序共用地址空间,受限于2GB地址空间;

线程之间的同步和加锁控制比较麻烦;

一个线程的崩溃可能影响到整个程序的稳定性;

到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;

线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU

多进程优点:

每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;

通过增加CPU,就可以容易扩充性能;

可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;

每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大

多线程缺点:

逻辑控制复杂,需要和主程序交互;

需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算

多进程调度开销比较大;

最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这改枣个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题……

方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/12328229.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存