首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

while循环从2个不同的pthread读取相同的变量,但代码未运行

首先,while循环是一种迭代结构,用于重复执行一段代码,直到满足特定条件为止。在这种情况下,while循环用于从两个不同的pthread线程中读取相同的变量。

在多线程编程中,使用pthread库可以创建和管理线程。每个线程都是独立执行的,可以并发地访问共享的变量。然而,当多个线程同时读取和写入相同的变量时,可能会出现竞态条件(Race Condition),导致不确定的结果。

为了避免竞态条件,可以使用互斥锁(Mutex)来保护共享变量的访问。互斥锁可以确保在任意时刻只有一个线程可以访问共享变量,其他线程需要等待锁的释放才能继续执行。

在这种情况下,可以在两个pthread线程中使用互斥锁来保护对共享变量的访问。具体的代码实现如下:

代码语言:txt
复制
#include <pthread.h>

int sharedVariable = 0;
pthread_mutex_t mutex;

void* threadFunction(void* arg) {
    while (1) {
        pthread_mutex_lock(&mutex);
        // 读取共享变量
        int value = sharedVariable;
        pthread_mutex_unlock(&mutex);
        
        // 进行其他操作
        // ...
    }
    return NULL;
}

int main() {
    pthread_t thread1, thread2;
    pthread_mutex_init(&mutex, NULL);
    
    // 创建两个线程
    pthread_create(&thread1, NULL, threadFunction, NULL);
    pthread_create(&thread2, NULL, threadFunction, NULL);
    
    // 等待线程结束
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    
    pthread_mutex_destroy(&mutex);
    return 0;
}

在上述代码中,两个pthread线程通过互斥锁保护共享变量的读取操作。其中,pthread_mutex_lock函数用于获取互斥锁,pthread_mutex_unlock函数用于释放互斥锁。

需要注意的是,互斥锁的使用需要谨慎,过多地使用互斥锁可能会导致线程间的竞争和性能下降。因此,在实际开发中,需要根据具体情况综合考虑并发性和数据一致性的需求,选择合适的同步机制。

关于云计算和IT互联网领域的相关名词和概念,以及腾讯云相关产品和介绍链接地址,可以根据具体的名词提供更详细的信息和推荐。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

原创|X侦探所事件簿|内存到哪里去了

对于数据库来说,如果数据都能加载到内存中,不需要从磁盘读取,那速度肯定是杠杠。但是,对于现在应用来说,几十GB乃至TB级别的数据,都是常见情况,内存多是十几GB。...在该文件中,更详细展示程序运行中内存使用情况,不同内核版本输出信息不尽相同,所以需要根据实际环境查找对应手册。...由size命令,引入代码段等概念,我们需要介绍一下Linux运行时,程序内存空间分布,其情况如下图所示 所有代码代码段都是0x400000虚拟地址空间开始,从这里开始,以此向上存储代码空间...,初始化全局变量空间,初始化全局变量空间。...如上我们运维角度了解到内存一些知识,下面将会通过简单代码,验证一下关于mmap,malloc以及thread stack 局部变量和status文件中VmRSS等信息关系。

57220

线程(二)线程互斥+线程同步

_ lock 时,可能会遇到以下情况: 互斥量处于锁状态,该函数会将互斥量锁定,同时返回成功 发起函数调用时,其他线程已经锁定互斥量,或者存在其他线程同时申请互斥量,没有竞争到互斥量,那么pthread...一个函数在重入情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。...常见线程不安全情况: 不保护共享变量函数 函数状态随着被调用,状态发生变化函数 返回指向静态变量指针函数 调用线程不安全函数函数 常见线程安全情况 每个线程对全局变量或者静态变量只有读取权限...循环等待条件:若干执行流之间形成一种头尾相接循环等待资源关系 避免死锁方法 破坏死锁四个必要条件 加锁顺序一致 避免锁释放场景 资源一次性分配 Linux线程同步 条件变量 当一个线程互斥地访问某个变量时...条件变量使用规范 等待条件代码 pthread_mutex_lock(&mutex); while (条件为假) pthread_cond_wait(cond, mutex);

1.2K10
  • UIUC CS241 讲义:众包系统编程书

    偏移量是变量开始地方。电话变量第0x128字节开始,持续 sizeof(int)字节,并非总是如此。偏移量并不决定变量结束位置。考虑在许多内核代码中看到以下黑客行为。...您需要传递一个指向函数指针,以便线程知道哪里开始。 您创建所有线程都存在于相同虚拟内存中,因为它们是同一进程一部分。因此,它们都可以看到堆、全局变量和程序代码等。...互斥体陷阱 所以 pthread_mutex_lock在其他线程读取相同变量时会停止吗? 不,互斥体不是那么聪明 - 它与代码(线程)一起工作,而不是数据。...考虑以下代码while(flag2 ) { /* busy loop - go around again */ 一个高效编译器会推断flag2变量循环内部永远不会改变,因此测试可以优化为while...什么是条件变量?为什么使用条件变量比使用“while循环更有优势? 为什么这段代码很危险?

    83710

    C语言服务器编程必备常识

    sigset_t 每个元素每个位表示一个信号,所以相同信号只能表示一次。 子进程有和父进程相同信号掩码,挂起信号集【发送但是被阻塞信号】为空,就是说阻塞信号是不可能发给子进程。...通过向pthread_t(ID)=pthread_create传递线程函数地址和函数参数来创建线程。 注意当前线程pthread_create返回前,新创建线程可能已经运行完毕了。...)那段程序是临界区】。 或者将桶理解为: 用来确保一次只能由一个人舀水变量。 在访问共享数据代码段周围加锁互斥量,则一次只能有一个线程进入该代码段。...对于不同线程函数顺序应该不重要 线程运行于解锁和阻塞之间时,其他线程才能改变共享数据状态。 此时共享状态改变,本线程是无法知道。 ->需要条件变量。 队列满,队列空,满空就是条件变量。...pthread_cond_timedwait意思就是我在这里等time时间,如果时间内条件变量变了,或者不变,我都要跳出while(谓词)循环,按情况处理。

    1.3K20

    一文搞懂Linux多线程【下】

    为什么都是9号呢? 我们知道,如上两点代码是两个不同执行流,究竟是哪个执行流先被执行呢?不确定,这是由编译器调度顺序决定。但是我们运行结果证明是主线程先被执行。为什么?...这个函数内变量是被所有的线程共享吗?我们实验一下: 我们对打印内容做稍稍改动: 我们发现:不同执行流cnt地址都不同,说明每一个线程都有一个独立栈结构。 至于在什么位置,我们后面再说。...return (void*)123; 运行一下: 看,我们输入123成功读取到了 。...接着,我们做部分代码修改 __thread int g_val = 100; 我们发现,新线程对数据进行修改,主线程读取数据并未改变,并且地址读取地址也不同。 对比,我们发现,前后地址差别好大。...在一个全局变量前加__thread,可以将一个内置类型设置为线程局部存储(就本例子而言,添加前,数据存储在已初始化数据段;添加后,在运行时,会将数据给每个线程都拷贝一份,存储在自己栈中,线程之间数据修改彼此互不影响

    15710

    linux 编程常用进程间通信方式:互斥锁和条件变量、共享内存和信号量

    本文介绍常见进程间通信方式,分为互斥锁和条件变量,共享内存和信号量两部分,并分别给出样例使用方式和运行结果: 一、互斥锁和条件变量 1....生产者向内存区写入数据,同时修改head和tail,消费者内存区读取数据,也修改head和tail。 对于内存区不允许消费者和生产者同时访问,因此使用pthread_mutex_t进行互斥锁保护。...运行截图如下: 其中H表示head位置,T表示tail位置,点表示内存区域为空,可能生产数据或者已经被消费完成了。...,在不同进程里面映射位置不同; 为了访问共享内存,需要信号量进行保护,信号量需要通过semctl初始化为某个值; 接下来生产者和消费者要通过semop(-1)来竞争信号量,如果生产者抢到信号量则写入...producer中让用户输入几个整数,并将输入整数保存到共享内存中,然后consumer共享内存中读取整数相加产生结果。这里信号量只设定为1,起到了互斥锁作用。

    2.4K80

    Linux:多线程(二.理解pthread_t、线程互斥与同步、基于阻塞队列生产消费模型)

    当程序结束时,操作系统会自动释放程序占用资源 全局变量和静态变量都是在程序运行期间一直存在变量,但它们有一些重要区别: 作用域不同: 全局变量作用域是整个程序,即在定义它文件中任何地方都可以访问...静态变量作用域限定在定义它函数或文件内部,外部无法直接访问。 生命周期不同: 全局变量生命周期是整个程序运行期间,即在程序启动时分配内存,在程序结束时释放内存。...静态变量生命周期是整个程序运行期间,但是在定义它作用域内,它只会被初始化一次,直到程序结束才会被销毁。 存储位置不同: 全局变量存储在静态存储区,程序启动时就会被初始化。...申请锁成功:函数就会返回,允许你继续向后运行 申请锁失败:函数就会阻塞,不允许你继续向后运行 函数调用失败:出错返回 当调用 pthread_mutex_lock 函数时,如果互斥量处于锁定状态,那么该函数会成功将互斥量锁定...并发度:生产者线程可以并发地运行,以提高数据生成速度。需要注意同步和互斥问题,以避免多个生产者同时写入数据导致冲突。

    46410

    Linux线程-互斥与同步

    : 更新寄存器里面的值,执行-1操作 store :将新值,寄存器写回共享变量ticket内存地址 –执行对应汇编代码: 152 40064b: 8b 05 e3 04 20 00 mov...1,由此才能往下执行,否则只能进行等待 二、可重入/线程安全 1、基本概念 线程安全: 多个线程并发同一段代码时,不会出现不同结果,没有数据错乱情况 常见对全局变量或者静态变量进行操作...,并且没有锁保护情况下,会出现该问题 重入: 同一个函数被不同执行流调用,当前一个流程还没有执行完,就有其他执行流再次进入,我们称之为重入 一个函数在重入情况下,运行结果不会出现任何不同或者任何问题...常见线程不安全情况: 不保护共享变量函数 函数状态随着被调用,状态发生变化函数 返回指向静态变量指针函数 调用线程不安全函数函数 常见线程安全情况: 每个线程对全局变量或者静态变量只有读取权限...:若干执行流之间形成一种头尾相接循环等待资源关系 注:对于死锁,四个条件缺一不可 避免死锁: 破坏死锁四个必要条件 加锁顺序一致 避免锁释放场景 资源一次性分配

    1.7K20

    【iOS底层技术】 锁基本使用

    然后,它可以队列中提取一些数据并更新队列状态。以下示例显示了消费者线程处理循环基本结构。...以下部分向您展示了如何使用代码条件。 使用NSCondition类 NSCondition类提供与POSIX条件相同语义,将所需锁和条件数据结构都封装在一个对象中。...虽然两个锁结构是分开互斥锁在运行时与条件结构紧密相连。 等待信号线程应始终使用相同互斥锁和条件结构。更改配对可能会导致错误。 清单4-5显示了条件和谓词基本初始化和使用。...在初始化条件和互斥锁后,等待线程使用ready_to_go变量作为谓词进入while循环。 只有当谓词设置好,条件随后发出信号时,等待线程才会醒来并开始工作。...pthread_mutex_lock(&mutex); // 如果已经设置了谓词,则绕过while循环; // 否则,线程将休眠,直到设置谓词为止.

    88320

    多线程专题之线程死锁原因之谜

    教科书:说很具体,理解很抽象   关于死锁产生原因《操作系统》中有比较好说明:   (1)因为系统资源不足。   (2)进程运行推进顺序不合适。   (3)资源分配不当等。   ...(3)不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。   (4)循环等待条件:若干进程之间形成一种头尾相接循环等待资源关系。   ...当两个线程读写相同变量时,线程A读取变量然后给予变量赋予一个新值,但是写操作需要两个存储器周期。当线程B在这两个存储器周期中间读取这个相同变量时,它就会得到不一致值。...我们可以看到,增量操作分为三个步骤进行:(1)内存单元读入寄存器。(2)寄存器中进行变量增加。(3)把新值写回内存单元。如果两个线程试图同时对统一变量执行增量操作时,结果可能出现不一致。...变量可能比原来增加了1,也可能增加了2,具体是1,还是2取决于第二个线程读取变量时获得值是5还是6。

    87720

    【Linux】一篇文章带你了解Linux多线程&&线程控制&&线程安全&&线程互斥详解

    对于pthreads函数错误,建议通过返回值业判定,因为读取返回值要比读取线程内errno变量开销更小 #include #include #include...现在我们把lock和unlock代码改一下 3.5 可重入VS线程安全 3.5.1 概念 线程安全:多个线程并发同一段代码时,不会出现不同结果。...一个函数在重入情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数 3.5.2 常见线程不安全情况 不保护共享变量函数 函数状态随着被调用,状态发生变化函数...其与普通队列区别在于,当队列为空时,队列获取元素操作将会被阻塞,直到队列中被放入了元素;当队列满时,往队列里存放元素操作也会被阻塞,直到有元素被队列中取出(以上操作都是基于不同线程来说,...创建固定数量线程池,循环任务队列中获取任务对象, * 2.

    18710

    【Linux】线程安全——补充|互斥、锁|同步、条件变量

    .更改数据3.写回数据 对一个全局变量进行多线程更改是不安全: 对变量进行++或者–,在C、C++上看起来只有一条语句,但是汇编之后至少是三条语句: 1.内存读取数据到CPU寄存器中2.在寄存器中让...在C、C++上,看起来只有一条语句,但是汇编之后至少是三条语句: 1.内存读取数据到CPU寄存器中 2.在寄存器中让CPU进行对应算逻运算 3.写回新结果到内存中变量位置 对一个资源访问时候...); pthread_join(t3, nullptr); pthread_join(t4, nullptr); return 0; } 局部锁使用 局部锁+for循环创建线程代码...一个函数在重入情况下,运行结果不会出现任何不同回或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数 线程安全:多个线程并发同一段代码时,不会出现不同结果,常见对全局变量或者静态变量进行操作....不剥夺:一个执行流获得资源在使用完之前,不能强行剥夺 4.环路等待条件:执行流间形成环路问题,循环等待资源 避免死锁,1.破坏死锁四个必要条件2.加锁顺序一致3.避免锁释放场景4.资源一次性分配

    28420

    线程、进程通信原理让你彻底整明白

    需要注意是,这三个问题中后面两个问题同样也适用于线程 第一个问题在线程间比较好解决,因为它们共享一个地址空间,它们具有相同运行时环境,可以想象你在用高级语言编写多线程代码过程中,线程通信问题是不是比较容易解决...假如进程 1 是最后存入,则 turn 为 1 。当两个进程都运行while 时候,进程 0 将不会循环并进入临界区,而进程 1 将会无限循环且不会进入临界区,直到进程 0 退出位置。...上面的代码实际上是通过两种不同方式来使用信号量,而这两种信号量之间区别也是很重要。mutex 信号量用于互斥。它用于确保任意时刻只有一个进程能够对缓冲区和相关变量进行读写。...消息传递系统设计要点 消息传递系统现在面临着许多信号量和管程所涉及问题和设计难点,尤其对那些在网络中不同机器上通信状况。例如,消息有可能被网络丢失。...窍门在于确保每个读操作要么读取版本,要么读取版本,例如下面的树 13.jpg 上面的树中,读操作根部到叶子遍历整个树。

    86720

    【Linux线程】Linux多线程编程:深入理解线程互斥与同步机制

    ticket内存加载到寄存器中 update : 更新寄存器里面的值,执行-1操作 store :将新值,寄存器写回共享变量ticket内存地址 解决方案: 代码必须要有互斥行为:当代码进入临界区执行时...,或者存在其他线程同时申请互斥量,没有竞争到互斥量,那么pthread_ lock调用会陷入阻塞(执行流被挂起),等待互斥量解锁 代码示例:(改进后) // 获取名字 #include <stdio.h...可重入VS线程安全 概念: 线程安全:多个线程并发同一段代码时,不会出现不同结果。...一个函数在重入情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数 常见线程不安全情况: 不保护共享变量函数 函数状态随着被调用,状态发生变化函数 返回指向静态变量指针函数...调用线程不安全函数函数 常见线程安全情况: 每个线程对全局变量或者静态变量只有读取权限,而没有写入权限,一般来说这些线程是安全 类或者接口对于线程来说都是原子操作 多个线程之间切换不会导致该接口执行结果存在二义性

    13510

    多线程同步与互斥

    成功时thread指向内存单元被设置为新创建线程线程ID。 (2)attr:用于定制各种不同线程属性,通常直接设为NULL。 (3)start_routine:新创建线程从此函数开始运行。...(4)arg:是传给start_routine函数实参,如果参数大于一个就需要用结构体来传参 首先加锁给我们直观现象就是程序运行速度变慢了,这是因为多线程并发运行变成了串行,且还要加解锁;此外我们发现以上两种写法...,不必再手动调用接口,且解锁过程就不需要我们显示去调用; 可重入与线程安全 线程安全:多个线程并发同一段代码时,不会出现不同结果。...一个函数在重入情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。...如果函数可重入,那么线程一定安全;线程安全,函数不一定可重入 常见线程安全情况 每个线程对全局变量或者静态变量只有读取权限,而没有写入权限,一般来说这些线程是安全 类或者接口对于线程来说都是原子操作

    21910

    今天,进程告诉我线程它它它它不想活了

    需要注意是,这三个问题中后面两个问题同样也适用于线程 第一个问题在线程间比较好解决,因为它们共享一个地址空间,它们具有相同运行时环境,可以想象你在用高级语言编写多线程代码过程中,线程通信问题是不是比较容易解决...假如进程 1 是最后存入,则 turn 为 1 。当两个进程都运行while 时候,进程 0 将不会循环并进入临界区,而进程 1 将会无限循环且不会进入临界区,直到进程 0 退出位置。...上面的代码实际上是通过两种不同方式来使用信号量,而这两种信号量之间区别也是很重要。mutex 信号量用于互斥。它用于确保任意时刻只有一个进程能够对缓冲区和相关变量进行读写。...消息传递系统设计要点 消息传递系统现在面临着许多信号量和管程所涉及问题和设计难点,尤其对那些在网络中不同机器上通信状况。例如,消息有可能被网络丢失。...然而,在某些情况下,我们可以允许写操作来更新数据结构,即便还有其他进程正在使用。窍门在于确保每个读操作要么读取版本,要么读取版本,例如下面的树 ? 上面的树中,读操作根部到叶子遍历整个树。

    52510

    Linux:多线程(三.POSIX信号量、生产消费模型、线程池、其他常见锁)

    现在因为是循环队列我们使用了两个索引,而两个索引不同时可以同时进行出和入 当为空时或者满时,二者只能有一个开始执行。...va_copy:va_copy 宏用于将一个 va_list 类型变量值复制给另一个 va_list 类型变量,以便在后续代码中再次访问相同可变参数列表。...va_copy 函数原型类似于 va_copy(va_list dest, va_list src),通过将源 va_list 复制给目标 va_list,使得目标 va_list 在后续代码中可以重新访问相同可变参数列表...,因为,在更改前,新线程可能已经运行完Task函数,直接退出了 // 在让线程跑之前,初始化就要做好 } void Wait() { for...下面我们简要解释一下这段伪代码逻辑: reader_count表示当前正在读取数据读者数量。

    22810

    Linux——多线程

    (比如虚拟地址空间中堆区,栈区,内核区,通过页表映射到不同物理地址内存) 虚拟地址到物理地址是怎么样通过页表访问呢?...这里有两个执行流,PID相同,说明属于同一个进程,旁边LWP不同,这个就是轻量级进程id。 两个id相同是主线程,不同是新线程。...这个功能就是保存热点数据(就是保存这条代码附近代码,因为很有可能会访问到附近代码) 也就是说如果某个进程先让部分代码放入eache中,然后CPU去这里找,如果命中才会重新去内存中找。...(并不是线程越多越好,要合适,最好要和CPU核数相同) 健壮性降低 编写多线程需要更全面更深入考虑,在一个多线程程序里,因时间分配上细微偏差或者因共享了不该共享变量而造成不良影响可能性是很大...pthreads同样也提供了线程内errno变量,以支持其它使用errno代码。对于pthreads函数错误,建议通过返回值业判定,因为读取返回值要比读取线程内errno变量开销更小。

    93130

    c++ 网络编程(九)TCPIP LINUXwindows--使用IOCP模型 多线程超详细教程 以及 多线程实现服务端

    运行结果看并不是0,而且每次运行结果都不同。那这是什么原因引起呢?...:线程A用户输入得到值后存入全局变量num,此时线程B将取走该值并累加。...例如,多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量值,而其他线程负责同时读取变量内容,则不能保证读取数据是经过写线程修改后。    ...为了确保读线程读取是经过修改变量,就必须在向变量写入数据时禁止其他线程对其任何访问,直至赋值过程结束后再解除对其他线程访问限制。...系 统也允许一个等待线程处理包如果运行线程进入任何形式等待状态,当这个线程等待状态进入运行状态,可能会有一个很短时期活动线程数量会超过 NumberOfConcurrentThreads

    3K20

    Linux下多线程编程实例解析

    操作系统会保证当线程数不大于CPU数目时,不同线程运行不同CPU上。   3) 改善程序结构。...创建线程成功后,新创建线程则运行参数三和参数四确定函数,原来线程则继续运行下一行代码。   函数pthread_join用来等待一个线程结束。...这也给多线程编程带来了许多问题。我们必须当心有多个不同进程访问相同变量。许多函数是不可重入,即同时不能运行一个函数多个拷贝(除非使用不同数据段)。...另外不同互斥锁类型对死锁处理不一样,最主要还是要程序员自己在程序设计注意这一点。...下面我们来看一个使用信号量例子。在这个例子中,一共有4个线程,其中两个线程负责文件读取数据到公共缓冲区,另两个线程从缓冲区读取数据作不同处理(加和乘运算)。

    2.6K42
    领券