0 0

多线程下为什么不能使用自增运算符5

最近在看别人写的代码,看到下面时心里有点不解
/* remember this is running multi-threaded!
   don't feel tempted to do msg->pop=++msg->seq ,
   which is likely to screw up */
msg->pop = msg->seq + 1;
这段C的代码在pthread_create()函数调用后出现的!
C 
2009年2月12日 15:55

2个答案 按时间排序 按投票排序

0 0

msg->pop = ++msg->seq 是两个操作,可能msg->seq在++之后被另一个线程++,然后再赋值给msg->pop,那样就不是预期的结果了。

也有可能是谨慎的作者觉得++太魔幻,怕出问题,分开小心一点好。

反正觉得和自增运算符没关系……

2009年2月14日 17:04
0 0

msg->pop=++msg->seq和msg->pop = msg->seq + 1这两个表达式的效果相同吗?

2009年2月13日 17:08

相关推荐

    关于C语言自增自减运算符的灵活使用.pdf

    1. 非局部变量的自增自减:对于全局变量和静态局部变量,自增自减操作是线程不安全的,多线程环境下可能导致数据竞争问题。 2. 函数参数:在函数调用中传递自增自减运算符的变量时,由于传值或传引用的不同,可能会...

    c语言自增与自减运算符共2页.pdf.zip

    自增运算符(++)将变量的值增加1,而自减运算符(--)则将其减少1。这两种运算符有前缀形式(前置++或前置--)和后缀形式(后置++或后置--),它们在语义上略有不同。 1. 前缀运算符:前置自增(++var)和前置自减...

    Java语言中自增、自减运算符解析.zip

    需要注意的是,自增和自减运算符不应滥用,特别是在涉及并发或者多线程的情况下。如果多个线程同时访问并修改同一个可变变量,可能会导致未定义的行为。因此,确保在这些情况下使用适当的同步机制是至关重要的。 ...

    试析二级C语言之自增、自减运算符.pdf

    7. 在一些编译器优化的特殊情况下,过度依赖自增和自减运算符可能会产生不可预料的结果,尤其是在涉及多线程的并发环境中。 8. 在处理指针数组或二维数组时,利用指针的自增和自减操作可以简洁地遍历数组元素。 9....

    基于C语言程序设计中自增与自减运算的探讨.pdf

    在C语言程序设计中,自增(++)和自减(--)运算符是程序员常用的高效工具,它们能够快速地...然而,也应警惕它们可能带来的问题,尤其是在涉及复杂逻辑和多线程环境时,合理使用并清晰表达代码逻辑是避免错误的关键。

    自增与自减

    2. **并发问题**:在多线程环境下,如果不加以适当的同步控制,自增与自减操作可能会引发数据不一致的问题。 3. **边界检查**:当处理有限范围内的数值时,需要注意自增或自减操作是否会超出有效范围,尤其是涉及...

    2013年微软暑期实习生笔试试题详解

    微软暑期实习生笔试试题详解 本资源涵盖了多个IT知识点,涉及C++编程、数据结构、...的结果是10,因为自增运算符的优先级高于赋值运算符。my=++my;的结果是11,因为自增运算符的结果是my的新值。输出结果为“10 11”。

    Java se 面试题.docx

    在这个例子中,`volatile`关键字保证了多线程环境下`instance`变量的可见性和有序性,确保了单例的正确初始化。 总结,Java SE面试题涵盖了基础语法和高级设计模式。理解自增运算符的行为和单例模式的实现是Java...

    为什么Python中没有"a++"这种写法

    首先,我们来看一下为什么 Python 不包含自增运算符。在 C 语言中,"a++" 是一个复合赋值运算符,它会将变量 a 的值增加 1,然后返回修改前的值。而在 Python 中,这种操作可以分解为两个步骤:先读取变量的值,然后...

    中软国际JAVA摸底考试题.docx

    3. `StringBuffer` 与 `StringBuilder` 类是用于字符串拼接的高效工具,尤其在多线程环境中,`StringBuffer` 是线程安全的,而 `StringBuilder` 更快但不保证线程安全。 4. 条件语句 `if((i>30&&i)||(i==60&&j>60))...

    Java中自增和自减操作符(++/--)的那些事

    应避免在同一条语句中多次修改同一个变量,或者在一个复杂的表达式中同时使用自增/自减操作符来修改多个变量。 6. 避免混淆 - 在面试或笔试中,关于自增/自减操作符的问题经常出现,以测试候选人的基本功。了解...

    浅谈c i++与java i++的区别

    这些区别对我们在编写代码时非常重要,特别是在多线程编程和并发编程中,正确理解i++的行为是非常关键的。 此外,我们还需要注意的是,在c语言和java语言中,i++的行为还受编译器和虚拟机的影响。在c语言中,编译器...

    东华软件面试题(部分)_嵌入式-常用知识&面试题库_大厂面试真题.doc

    本文档主要涵盖了东华软件面试题中的部分嵌入式常用知识点和面试题库,涵盖了C语言、数据结构、操作系统、多线程等方面的知识点。 1. i++与++i 执行先后顺序 在C语言中,i++和++i都是自增运算符,但是它们的执行...

    湖南科技职业学院(软件学院)Java卷

    2. **自增运算符**:`++`是自增运算符,将变量的值增加1。题目中`y = x ++;`执行后,y的值等于x原来的值4,因为这里是后置自增,所以x自增发生在赋值之后。 3. **位运算符**:题目中的`n ;`是左移运算,将n的二进制...

    深圳职业技术学院——《面向对象程序设计(Java)》A卷

    本题涉及的知识点广泛,涵盖了Java程序的运行环境、基本语法、数据类型、流程控制、数组、多线程、文件操作以及网络协议等。 1. 一个Java程序运行的环境次序是从操作系统开始,然后是Java运行时环境(JRE或JVM),...

    C语言优先级

    单目运算符是指只需要一个操作数的运算符,例如负号运算符(-)、按位取反运算符(~)、自增运算符(++)、自减运算符(--)、取地址运算符(&)、取值运算符(*)以及逻辑非运算符(!)。这些运算符通常具有从右向...

    微软2013试题

    总结,这些题目涵盖了C++的多态性、调用约定、数据结构(链表与数组)、线程与进程的概念,以及C++和C#中的自增运算符和数组操作。这些都是计算机科学和软件开发的基础知识,对于理解这些概念和技术是至关重要的。

    java中for(int i= 0; i<=10;i=i++)System.out.print(i);为什么无限输出0

    在本文中,我们将深入探讨一个有趣的`for`循环示例,并解释为什么该示例会导致一个无限循环并无限输出数字0。 #### 循环示例 考虑以下Java代码片段: ```java public class Test { public static void main...

Global site tag (gtag.js) - Google Analytics