在'paralelism'中执行线程

时间:2016-05-08 16:13:55

标签: c multithreading pthreads

我有一个数字范围(即1~10000) 我需要创建threads来搜索值X.
每个线程都有自己的间隔来搜索它(即10000 / threadNumber) 我想没有意义让线程按顺序运行。我有问题让它们同时运行......

我的代码到目前为止:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define limit 10000
#define n_threads 2


void* func1(void* arg)
{
    int i=0, *value = (int *)arg;
//How may I know which thread is running and make the thread search for the right range of values ?
    for(i=1; i<=limit/n_threads; i++)
    {
        if(*value == i){
           //Print the thread ID and the value found.
        }
        else
          //Print the thread ID and the value 0.
    }
    return NULL;
}

int main(int argc, char const *argv[])
{
    if(argc < 2)
        printf("Please, informe the value you want to search...\n");
    else{
        pthread_t t1, t2;
        int x = atoi(argv[1]);  //Value to search

        pthread_create(&t1, NULL, func1, (void *)(&x));
        pthread_create(&t2, NULL, func1, (void *)(&x));
        pthread_join(t1, NULL);
        pthread_join(t2, NULL);
    }

    return 0;
}  

到目前为止的问题:

  • 我不知道如何找到thread ID。 (试过pthread_self(),但我总是得到一个巨大的负数,所以我觉得有些不对劲。
  • 我知道pthread_create()创建并初始化线程,pthread_join也会使我的主程序等待线程。但是看看我的代码,似乎并没有同时运行。
  • 我的threadX如何知道从哪个值开始搜索? (即:如果我有10个线程,我认为我不必创建10个函数o.O)。

  • 是否可以让它们在没有像Mutex这样的情况下同时运行?

1 个答案:

答案 0 :(得分:1)

获取线程ID因操作系统而异。

请参阅how to get thread id of a pthread in linux c program?提及的@ user3078414和why compiler says ‘pthread_getthreadid_np’ was not declared in this scope?

致@Dmitri,一个将多个值传递给线程函数的示例。线程并发运行。互斥体是处理共享数据以及如何访问它的另一章。

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

#define limit 10000
#define n_threads 2

struct targs {
  int from;
  int to;
};

void *func1(void *arg) {
  struct targs *args = (struct targs *) arg;
  printf("%d => %d\n", args->from, args->to);
  // free(arg)
  return NULL;
}

int main(int argc, char const *argv[]) {
  struct targs *args;
  pthread_t t1;
  pthread_t t2;

  args = (struct targs *) malloc(sizeof(args));
  args->from = 0;
  args->to = 100;
  pthread_create(&t1, NULL, func1, (void *) args);

  args = (struct targs *) malloc(sizeof(args));
  args->from = 100;
  args->to = 200;
  pthread_create(&t2, NULL, func1, (void *) args);

  pthread_join(t1, NULL);
  pthread_join(t2, NULL);

  return 0;
}