是否允许在c中使用相同的静态void函数来使用多个线程?

是否允许在c中使用相同的静态void函数来使用多个线程?,c,multithreading,mutex,C,Multithreading,Mutex,我认为这个问题是不言自明的,但这里有一个例子,我指的是什么。说我们有 static void *foo(void * bar) { //some random function/method/calculation/data manipulation. } 创建多个线程并使用相同的函数是否安全/可能?我有一个非常长的文件(接近1000行),上下滚动开始变得很长。长话短说,我承受不起错误或意外的功能。或者我最好的选择是创建另一个C文件?我的静音和一切都是坚实的。所以我不太担心 int

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

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中是常量,所以多个线程使用相同的函数没有问题。重要的是这些功能对数据的使用:必须保护对共享可修改数据的任何访问

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

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

几千行不是很多数据,一个线程是解决问题的一种更简单的方法。除非这些数据的处理是非常CPU密集型的,否则多线程将产生更多的问题,而带来的好处微乎其微


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

是的,这很好。您是否认为这是一个问题,因为在多线程处理时,函数中的静态变量通常是不安全的?静态函数与局部静态变量不同——静态函数仅在其声明的文件中可见,而静态变量具有持续存在的值。将同一函数传递给多个线程是创建工作线程和类似线程时的标准做法,因此它不仅可行,但是很平常。我是C新手,我需要完成这个程序,我遇到这个问题是因为我担心线程会作为一个线程运行,或者以类似的方式运行。导致冲突和错误。但是,由于这是线程安全的(至少在大多数情况下听起来是这样),我只需要找出一种好的方法来更改变量,以便我可以操作我需要的线程。我感谢您抽出时间回答我的问题,各位,然而,问题仍然存在,我是否应该记住并注意什么?还有我的第二个问题,因为这是C语言的标准实践,我应该记下这个问题吗?@itsMe:正确的线程编程至少可以说是不平凡的。您的问题的答案是肯定的,可以将相同的函数传递给并行执行的不同线程,但问题在于如何处理从这些线程访问共享数据的细节。这样的讨论远远超出了评论或回答所能解释的范围。如果没有关于执行什么数据操作的任何信息,甚至无法给出如何或如何操作的线索。我正在考虑创建一个循环,操作foobar,并将我需要的东西传递到每个线程中,这是一个可行的选项吗?@itsMe:这是可能的,但可能非常棘手。是什么让你认为多线程会有所帮助?你想解决什么问题?我需要多个线程来利用有限的资源完成大量的工作,并且我需要确保它不会死锁。我在考虑将threadNo作为int传递到foobar中。我基本上只需要跟踪每个线程,因为我有许多全局数组需要处理,传递threadNo可以帮助我跟踪需要处理的数组索引,就像我之前在代码中所说的那样,确保它不会发生错误死锁。我的建议是不要使用线程,特别是当您的问题涉及全局数组时。