两线程竞争修改全局变量

#include <pthread.h>
#include <iostream>
using namespace std;

int global = 0;
#define NUMTHREADS 2

pthread_mutex_t mutexnum;

struct thread_data{
    int idx;
};

struct thread_data thread_data_array[NUMTHREADS];

void * assign_value(void *param){

    struct thread_data *my_data = (struct thread_data *) param;
    pthread_mutex_lock(&mutexnum);
    global =  my_data->idx;
    cout << "start with" << global << endl;
    for(int i = 0; i < 1000; i++){} // do some work
    cout << "end with " << global << endl;
    pthread_mutex_unlock(&mutexnum);

}

int main(){

    pthread_t threads[NUMTHREADS];
    cout << "initial value " << global << endl;
    pthread_mutex_init(&mutexnum, NULL);
    for(int i = 0; i < NUMTHREADS; i++){
        thread_data_array[i].idx = i + 1;
        pthread_create(&threads[i], NULL, assign_value, (void *) &thread_data_array[i]);
    }

    for(int i = 0; i < NUMTHREADS; i++)
        pthread_join(threads[i], NULL);

    cout << "final value " << global << endl;
    pthread_mutex_destroy(&mutexnum);
    pthread_exit(NULL);
}
  1. 定义两个线程, threads[0] 和 threads[1];
  2. 定义全局变量 int global = 0;
  3. 在函数assign_value中,更改全局变量global;
  4. 加mutex锁避免逻辑错误。

输出结果:

initial value 0
start with1
end with 1
start with2
end with 2
final value 2

时间: 2025-01-07 13:23:18

两线程竞争修改全局变量的相关文章

Ajax修改全局变量问题解决方法(jQuery版)

前两天项目遇到一个用ajax修改全局变量的案例,一开始无法给这个全局变量修改赋值,在网上查了一下,解决如下: 修改前: var word=1; $.ajax({ url:"myJSON.json", type:"get", dataType:"json", success:function(data){ word=2; } }); alert(word); 结果:弹出1: 原因:js是单线程的语言,而ajax是异步加载的,可以这么理解,上面的代码

global关键字修改全局变量

#我们知道全局变量在函数外部,强烈建议不要在函数内部修改全局变量,正常情况下,在函数内部改变全局变量并不影响全局变量的值,举例如下 count = 5 >>> def myfun(): count = 10 #在函数内部修改了count print(count) >>> myfun() #调用myfun函数并执行,输出count值为1010>>> count #可见在外面的count值仍然不变.5>>> print (count)5

JavaScript函数内部修改全局变量的问题【一道面试题】

JavaScript函数内部修改全局变量的问题 今天 10:44梵天莲华 | 浏览 23 次 Javascript编程语言函数 修改标签 代码如下,为什么加了 function a(){};这个函数,就不能改变全局变量a的值了? var a = 1; function b(){ a = 2; console.log(a); //有函数,a不变:没函数,a变2 function a(){}; } b();//输出2 console.log(a);//输出1 今天 11:07 提问者采纳 因为A.

线程------竞争,互斥量---多线程对同一文件读写问题

当多个控制线程共享相同的内存时呢,需要确保每个线程看到一致的数据视图. 如果每个线程使用的变量都是其他线程不会读取和修改,那么就不存在一致性的问题. 线程互斥接口用来保护数据,用于确保同一时间只有一个线程访问数据. 互斥:限制代码---独占 很久以前: 下面程序存在竞争问题的哟,当创建20个线程,每个线程都对同一个文件进行读写操作,有可能发生N个线程同时对文件进行打开和读操作,在写的过程可能会对同一个数重复进行+1操作.比如说读到  1, 然后N个线程取到1 并对1这个数做+1操作. /* 实现

C#学习之在辅助线程中修改UI控件----invoke方法

Invoke and BeginInvoke 转载地址:http://www.cnblogs.com/worldreason/archive/2008/06/09/1216127.html 在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate,至于委托的本质请参考我的另一随笔:对.net事件的看法. 一.为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己

两种方法修改table表的内容

用两种方法获取和修改table表中数据,代码如下: 第一种方案的思想是,根据table中的当前 tr 的位置来定位,当前修改的tr .     第二种方案的思想是,给table中的每个 tr 做一个标记,根据此标记来修改当前的tr .  html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>table</title> <sc

线程竞争问题

前言:   线程之间资源共享,所以不存在通信问题,但是会有很强烈的竞争问题,解决线程之间的竞争问题有以下几种方法: 1.互斥量 功能:保证同一时间只有一个线程可以对共享资源进行操作,但是不保证同步 步骤: 1.1初始化互斥量:(2中方法,,一般常用静态) 动态初始化: static  pthread_mutex_t     mm; prhread_mutex_init(&mm,NULL): 静态初始化: static  pthread_mutex_t    mm=PTHREAD_MUTEX_IN

default.properties里面的属性有两种方法修改

1   在struts.xml中constant中修改 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">

记两个用于修改用户态内存的函数

//用于在LoadImageRoutine中使用,修改用户态内存 PMDL MapUserModeAddrWritable(PVOID BaseAddr,ULONG Length, PVOID *pNewAddr); VOID UnmapMemory(PVOID pAddr, PMDL pMdl); PMDL MapUserModeAddrWritable(PVOID BaseAddr,ULONG Length, PVOID *pNewAddr) { PVOID pMapedAddr = NUL