【问题标题】:Is it allowed to use the same static void function to use multiple threads in c?是否允许使用相同的静态 void 函数在 c 中使用多个线程?
【发布时间】:2021-03-22 08:01:45
【问题描述】:

我认为这个问题是不言自明的,但是这里是我所指的一个例子。说我们有

static void *foo(void * bar) {

    //some random function/method/calculation/data manipulation.

}

创建多个线程并使用相同的功能是否安全/可行?我有一个非常长的文件(接近 1000 行)它开始变得冗长向上和向下滚动。长话短说,我不能承受错误或意外功能。或者我最好的选择是简单地创建另一个 C 文件?我的互斥,一切都是可靠的。所以我不太担心。

int main() {
Is something like this feasable?: 

    pthread_t A1, A2;
    pthread_creat(&A1, NULL, foo, &foobar);
    pthread_create(&A2, NULL, foo, &foobar);
    
    pthread_join(A1, NULL);
    pthread_join(A2, NULL);
}

如果我选择进入这条路线,有什么建议/注意事项吗?

【问题讨论】:

  • 是的,没关系。您是否认为这是一个问题,因为函数内的静态变量在多线程时通常是不安全的?静态函数与局部静态变量不同——静态函数仅在其声明的文件中可见,而静态变量具有持久的值。
  • 将相同的函数传递给多个线程是创建工人和类似的标准做法,所以它不仅可行,而且很常见。
  • 我是 C 新手,我需要完成这个程序,我遇到了这个问题,因为我担心线程会充当一个或类似的方式。导致冲突和错误。但是,由于这是线程安全的(至少在大多数情况下听起来是这样),我只需要找出一种更改变量的好方法,以便我可以操纵我需要的线程。
  • 感谢大家抽出宝贵时间回答我的问题,但是问题仍然存在,有什么我应该记住和注意的吗?以及我的第二个问题,因为这是 C 中的标准做法,我应该记下这个问题吗?
  • @itsMe:至少可以说,正确的线程编程并非易事。您的问题的答案是肯定的,可以将相同的函数传递给并行执行的不同线程,但问题在于您如何处理从这些线程访问共享数据的细节。这样的讨论远远超出了评论或答案中可以解释的内容。如果没有任何关于执行什么数据操作的信息,甚至无法给出关于如何或什至做什么的线索。

标签: c multithreading mutex


【解决方案1】:

代码在 C 中是不变的,所以多个线程使用相同的函数是没有问题的。重要的是这些功能对数据的使用:对共享可修改数据的任何访问都必须受到保护。

请注意,某些函数(例如 strtok())将其上下文存储在隐藏的静态数据中,因此可能不是线程安全的。

在您的示例中,您传递了同一 foobar 对象的地址。除非此对象在两个线程的整个生命周期中都保持不变,否则将存在对共享可修改数据的并发访问,这需要使用锁或其他形式的同步进行特殊处理。

几千行并不是很多数据,单个线程是解决问题的非常简单的方法。除非这些数据的处理是 CPU 密集型的,否则多线程会产生更多的问题而没有什么好处。

至少可以说,正确的线程编程并非易事。您的问题的答案是肯定的,可以将相同的函数传递给并行执行的不同线程,但问题在于您如何处理从这些线程访问共享数据的细节。这样的讨论远远超出了答案中可以解释的范围。如果没有任何关于执行什么数据操作的信息,甚至无法给出关于如何或什至做什么的线索。

【讨论】:

  • 我在考虑有一个循环并操纵 foobar 并将我需要的东西传递到每个线程中,这是一个可行的选择吗?
  • @itsMe:这是可能的,但可能非常棘手。是什么让您认为多线程会有所帮助?你想解决什么问题?
  • 我需要多个线程来利用有限的资源来完成大量工作,并且我需要确保它不会死锁。我正在考虑将 threadNo 作为 int 传递给 foobar。
  • 我基本上只需要跟踪每个线程,因为我有许多全局数组需要他们操作并传入 threadNo 帮助我跟踪我需要操作的数组索引正如我之前所说,输入代码以确保它不会死锁。
  • 我的建议是不要使用线程,尤其是当您的问题涉及全局数组时。
猜你喜欢
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多