
众所周知,多线程编程很容易遇到烦人的线程冲突,例如更新丢失,脏读和死锁. 一旦出现多线程问题,就很难定位和解决,因此在编程的初始阶段就必须注意避免多线程程序的常见错误. 以下总结了c ++多线程编程中遇到的一些个人问题.
1. 该类中的数据成员应设置有尽可能多的特殊功能以进行读写,并且互斥锁用于该功能中的并发保护.
无需解释即可解决线程冲突的最基本方法.
2. 该类中的成员函数应尽量避免在没有保护的情况下多次读取或修改成员变量.
如果成员函数多次读取和写入成员变量,则如果其他并发线程也在函数读取和写入成员变量的过程中修改了成员变量,则成员函数的操作可能会中断并引发一个未知错误.

示例:
class class1 {
字符*文本;
int func(){
如果(文本== 0){

返回-1;
}
cout << *文本<< endl;
返回0;
}

在上述程序中,func成员函数首先检查文本指针是否有效,如果有效,则输出其指向的内容. 此写方法不是串行运行的,但是如果是并行运行的,则很有可能func函数刚刚判断出文本指针暂时不为空. 其他线程将文本指针修改为NULL多线程编程之一——问题提出,然后将读取和写入func函数. 使用空指针崩溃.
对于此问题,即使您为文本设置了受保护的读写功能,该问题仍然存在. 正确的解决方案是在读写成员变量之前添加一个锁,然后释放该锁直到读写结束.
3. 如果某个锁定功能调用了另一个锁定功能,请注意检查两个功能是否使用了同一功能.
这个问题很容易理解. 如果两个功能使用相同的锁,则将导致死锁. 实际上,避免此问题的最佳方法是避免在锁定的函数中调用复杂的函数.
4. 对于锁定的不可重入函数,请使用pthread_mutex_trylock

锁定一个函数只能保证一个函数不会同时被多个线程执行,但是无法避免多个线程依次执行同一函数.
想象一下存在连接函数的情况,当线程发现连接失败并且创建连接需要很长时间时,就会调用该函数. 然后,如果一定数量的线程同时发现连接失败,它们将竞争调用连接功能. 尽管连接函数添加了一个锁,以避免被多个线程同时调用,但是当一个线程调用该连接函数时,其他线程将获取该锁多线程编程之一——问题提出,然后再次调用该连接函数. 如果此时有100个线程试图调用连接函数,则连接将重复100次,从而浪费资源.
解决上述问题的方法非常简单,即当一个线程正在执行连接功能时,其他线程不再执行该连接功能,而不必等待该线程再次执行. 可以使用Trylock函数来实现此目的. 大多数人只能保持锁定状态并解锁才能互斥锁定. 实际上,trylock也是一个非常有用的功能. 此功能是锁的非阻塞版本.
c ++多线程编程遇到的问题的摘要,Bubukou,bubuko.com
在c ++多线程编程中遇到的问题的摘要
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-166375-1.html
产品价高质次
最后的茜的镜头鸡皮疙瘩都起来了好美
抬高土地出让金
中国海军对日最大的优势在固定翼战机