【发布时间】:2021-06-06 20:35:42
【问题描述】:
我怀疑这可能是愚蠢的家伙。我有一个函数来计算一些数学公式作为例子。
# include <stdio.h>
# include <time.h>
# include <stdlib.h>
# include <pthread.h>
# include <unistd.h>
# include <math.h>
pthread_mutex_t a_mutex = PTHREAD_MUTEX_INITIALIZER;
volatile long int a = 0;
void threadOne(void *arg)
{
int i;
long int localA = 0;
for (i = 1; i < 50000000; i++)
{
localA = localA + i*a*sqrt(a);
}
pthread_mutex_lock(&a_mutex);
a = a + localA;
pthread_mutex_unlock(&a_mutex);
}
void threadTwo(void *arg)
{
int i;
long int localA = 0;
for (i = 50000000; i <= 100000000; i++)
{
localA = localA + i*a*sqrt(a);
}
pthread_mutex_lock(&a_mutex);
a = a + localA;
pthread_mutex_unlock(&a_mutex);
}
int main (int argc, char **argv)
{
pthread_t one, two;
int i;
pthread_create(&one, NULL, (void*)&threadOne, NULL);
pthread_create(&two, NULL, (void*)&threadTwo, NULL);
pthread_join(one, NULL);
pthread_join(two, NULL);
}
现在这是我找到的一个例子,我有两个函数,每个函数都有一个线程,所以一个是在不同的线程上计算的。但是我可以只有一个函数,然后对一个函数有两个线程,所以该函数使用不同的数据运行两次吗?我的想法是这样的:我只有一个函数可以有两组不同的数据,然后根据正在运行的线程,该函数可以使用第一组或第二组运行。
但这可能吗?我想避免像这里一样复制函数两次。
假设我只保留功能
void threadOne(void *arg)
但是我使用不同的线程同时使用不同的数据运行它两次,这可以实现还是我只是傻?。
【问题讨论】:
-
是的。只需要对修改过的数据进行互斥,代码和只读数据就可以共享就好了。
-
谢谢,我正在编码,对此有疑问。非常感谢!,我刚开始使用 pthreads 并且是一个相当新的东西:)。再次感谢巴尔玛!。
-
当然。 pthread API 为您提供
void*以将数据传递到线程函数。您可以将struct *放入其中并将其转换回函数中的结构指针。它可以包含所有工作数据或指向全局工作数组的指针。例如,您可以将一个大数组中的 1 亿个元素除以线程数,然后将开始和结束元素传递给每个线程。 -
只需确保为每个线程分配一个线程参数。不要试图重用同一个来创建许多线程。不知何故,我看到人们经常犯这个错误。还要确保线程参数与线程一样长。不要错误地在函数中为 10 个线程声明一个 10 个 arg 结构的数组,创建线程,然后退出函数。因为那时每个线程都指向未分配的堆栈内存。
-
缩进让你的代码可读...