【问题标题】:Can I use pthreads over the same function on C?我可以在 C 上的同一个函数上使用 pthreads 吗?
【发布时间】: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 结构的数组,创建线程,然后退出函数。因为那时每个线程都指向未分配的堆栈内存。
  • 缩进让你的代码可读...

标签: c function pthreads


【解决方案1】:

是的,这可以通过使用线程函数的参数来完成。

每个线程都需要循环一系列值。所以创建一个结构定义来包含最小值和最大值:

struct args {
    int min;
    int max;
};

定义一个单线程函数,它将void * 参数转换为指向该类型的指针并读取它:

void *thread_func(void *arg) 
{
    struct args *myargs = arg;
    int i;
    long int localA = 0;
    for (i = myargs->min; i < myargs->max; i++) 
    {
        localA = localA + i*a*sqrt(a);
    }
    pthread_mutex_lock(&a_mutex);
    a = a + localA;
    pthread_mutex_unlock(&a_mutex);
    return NULL;
}

(请注意,该函数需要返回一个void * 以符合pthread_create 期望的接口。)

然后在您的main 函数中为每组参数创建此结构的实例,并将其传递给pthread_create

int main (int argc, char **argv) 
{
    pthread_t one, two;
    struct args args1 = { 1, 50000000 };
    struct args args2 = { 50000000 , 100000000 };
    pthread_create(&one, NULL, thread_func, &args1);
    pthread_create(&two, NULL, thread_func, &args2);
    pthread_join(one, NULL);
    pthread_join(two, NULL);
}

【讨论】:

  • 明天早上去试试,但会回来告诉你;)!。
  • 谢谢你,它完美无瑕:)。需要重新安排我的数据,所以很棒:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 2020-11-01
相关资源
最近更新 更多