【问题标题】:Using shared variables in pthread在 pthread 中使用共享变量
【发布时间】:2019-08-07 09:07:17
【问题描述】:

在下面的示例代码中,我使用共享变量将信息传递给线程。 maintest 将被调用几次,每次都会创建一个包含新信息的新线程。我使用互斥锁来确保共享数据正确传递给相应的线程。

由于某种原因,我无法使用 struct 数据类型将信息作为参数传递给线程,因为我使用的软件具有自定义数据类型,并且每次它都会使我的应用程序崩溃。

有人可以告诉我下面的实现是否正确吗?

    void* fun1(void* a);    

    int threadCnt;
    int        arg_tnum;
    float    arg_measArray;
    string     arg_waveID;
    float      arg_Freq;
    bool       arg_enablePlots;
    pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;
    pthread_t th1[10];

    void maintest()
    {     
        pthread_mutex_lock( &mutex1 );
        arg_tnum =  threadcnt+10;
        arg_freq = arg_tnum * 2;
        arg_measArray = arg_Freq *3;
        arg_enablePlots =true;
        pthread_mutex_unlock( &mutex1 );

       threadCnt = threadCnt+1;
       pthread_create(&th1[threadCnt],NULL,fun1,NULL);

    } 

    void* fun1(void* a)
    {
      int index;
      float freq;
      float meas;
      bool  enableplt;

      pthread_mutex_lock( &mutex1 );
      index = arg_tnum;
      freq = arg_Freq;
      meas = arg_measArray;
      enableplt = arg_enablePlots;
      pthread_mutex_unlock( &mutex1 );

      //print all the values
      cout << index << endl;
      cout << freq << endl;
      cout << meas << endl;
      cout << enableplt << endl;
      return NULL;
     }

【问题讨论】:

    标签: c++ pthreads mutex


    【解决方案1】:

    1) 为什么不使用标准机制,即std::threadstd::mutex

    2) 不,代码不正确。在第二次调用maintest() 将覆盖共享数据之前,无法保证fun1() 将被执行并读取其参数。

    【讨论】:

    • 2) 当maintest() 更新值时,互斥锁不会确保共享数据被锁定吗? maintest() 也是非线程的,它是串行运行的。
    • 您当前的代码将确保数据在修改时不会被读取,并且数据在读取时不会被修改(从不同的角度来看,这基本上是相同的)。但是没有任何机制可以防止在读取数据之前第二次覆盖数据。关于maintest() 是非线程的,你已经磨损了。 maintest() 也在某个线程中执行,我们将其命名为“main”,除了线程间同步之外,没有任何东西可以保证在 fun1() 读取共享值之前不会被调用两次。
    • 啊哈......我明白你的意思......我可以知道线程间同步的解决方法是什么吗?非常感谢一些示例代码。
    • 例如,您可以将条件变量与一些标志结合使用。所以它应该像这样工作:在maintest() 中检查标志是否未设置,在写入参数之前,等待条件变量是否已设置。编写参数时设置此标志。在func1() 中重置此标志并在读取参数后通知条件变量。
    猜你喜欢
    • 2021-06-22
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多