c - 是否允许使用相同的静态 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);
}
如果我选择进入这条路线,有什么建议/注意事项吗?
解决方案
代码在 C 中是不变的,因此多个线程使用相同的函数是没有问题的。重要的是这些功能对数据的使用:对共享可修改数据的任何访问都必须受到保护。
请注意,某些函数(例如strtok()
将其上下文存储在隐藏的静态数据中)可能不是线程安全的。
在您的示例中,您传递了同一foobar
对象的地址。除非该对象在两个线程的整个生命周期中都是恒定的,否则将存在对共享可修改数据的并发访问,这需要使用锁或其他形式的同步进行特殊处理。
几千行并不是很多数据,单个线程是解决问题的更简单的方法。除非这些数据的处理是 CPU 密集型的,否则多线程会产生更多的问题而没有什么好处。
至少可以说,正确的线程编程并非易事。您的问题的答案是肯定的,可以将相同的函数传递给并行执行的不同线程,但问题在于您如何处理从这些线程访问共享数据的细节。这样的讨论远远超出了答案中可以解释的范围。如果没有关于执行什么数据操作的任何信息,甚至无法给出关于如何或什至做什么的线索。
推荐阅读
- c++ - 如何将每秒接收的字节数和每秒发送的字节数转换为 MB?
- c# - 更改对象中每个字符串属性的值
- hadoop - 如何在谷歌云实例上运行 hortonworks 沙盒环境?
- python-3.x - 是否可以从保存的 html 文件中导入散景图?
- c# - 如何使用 WIA 扫描双面(双面?) - C#
- django - 带有计数注释的 django admin list_display
- c# - 在 AjaxToolKit Accordion 中放置一个中继器
- asp.net-core - 尽管在同一个网络中,但无法使容器通信
- excel - Oracle Ref Cursor ADODB - 为什么我得到 PLS-00306 错误的参数类型数量
- css - 使用兄弟文件中的 SASS 变量