首页 > 解决方案 > 是否允许使用相同的静态 void 函数在 c 中使用多个线程?

问题描述

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

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);
}

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

标签: cmultithreadingmutex

解决方案


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

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

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

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

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


推荐阅读