【问题标题】:pthread for many class variables用于许多类变量的 pthread
【发布时间】:2014-08-11 13:45:57
【问题描述】:

我有一个有很多私有变量的类。每个都有 getter 和 setter 方法。我有许多线程可以访问 setter 方法并更改变量的值。无需在每个 setter 方法中编写 mutex_lock 和 mutex_unlock,我如何确保只有一个线程正在为给定变量设置值。 (问题太幼稚请见谅)

class MyClass {
private:
  int var0,var1...upto var99
public:
  int getVar0() { return var0 }
  void setVar0(int x) { var0 = x }
 .
 .
 .
}

MyClass mClass;

void *foo0() {
  processMyClassObj0(); //does some process and sets some of 'var' variables of mClass
}
void *foo1() {
  processMyClassObj1(); //does some process and sets some of 'var' variables of mClass
}
.
.
.

int main() {
  pthread_t p[100];
  pthread_create(&p[0],NULL,foo0,NULL);
  pthread_create(&p[1],NULL,foo1,NULL);
  pthread_create(&p[2],NULL,foo2,NULL);
  .
  .
  .
  pthread_create(&p[99],NULL,foo99,NULL);
  pthread_exit(NULL);
}

【问题讨论】:

  • 你没有告诉我们你在哪里以及多久实例化你提到的类。
  • 为什么不能使用互斥锁?你也可以使用信号量吗?
  • @alk : 为线程访问的类创建一个全局对象。
  • @alk ,用示例代码更新了问题
  • “不必在每个 setter 方法中编写 mutex_lock 和 mutex_unlock,我如何确保只有一个线程正在为给定变量设置值...”通过任一 a) 确保你只有一个线程,或者 b) 确保没有两个线程包含尝试写入同一个变量的代码,或者 c) 使用互斥锁以外的东西(例如信号量、读取器/写入器锁等)来防止竞争.无论如何,互斥锁有什么问题?

标签: c++ pthreads


【解决方案1】:

您可以将“线程名”提供给您的设置器,并与您要修改的线程进行比较以更改您的值。

pthread_setname
pthread_getname

http://man7.org/linux/man-pages/man3/pthread_setname_np.3.html

【讨论】:

    【解决方案2】:

    如果p[n] 只使用varnn = {0..99}),则不需要任何同步机制。


    更新

    如果可能,否则declare the variables to be _Atomic 否则保护访问(通常通过互斥锁)。

    【讨论】:

    • 正如我在 cmets 中提到的“processMyClassObj1()”或“processMyClassObj2()”,每个方法都可以修改一些“var”变量。修改哪些变量取决于过程,这意味着对可以更改的“var”变量没有限制(即任何 var1..var100 都可以在不同情况下由任何 p[1..100] 更改) .
    猜你喜欢
    • 1970-01-01
    • 2022-12-02
    • 1970-01-01
    • 2013-02-04
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    相关资源
    最近更新 更多