在 'paralelism' 中执行线程
Executing threads in 'paralelism'
我有一个数字范围(即 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
会让我的主程序等待线程。但是查看我的代码,它似乎并没有同时 运行ing 。
我的 threadX
如何知道应该从哪个值范围开始搜索? (即:如果我有 10 个线程,我认为我不必创建 10 个函数 o.O )。
是否可以在没有类似 Mutex
的情况下同时使它们 运行?
获取线程 ID 因操作系统而异。
参见how to get thread id of a pthread in linux c program? as @user3078414 mentioned, and why compiler says ‘pthread_getthreadid_np’ was not declared in this scope?。
感谢@Dmitri,这是一个将多个值传递给线程函数的示例。线程 运行 并发。 Mutexes 是另外一章,专门讨论共享数据以及如何访问它。
#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;
}
我有一个数字范围(即 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
会让我的主程序等待线程。但是查看我的代码,它似乎并没有同时 运行ing 。 我的
threadX
如何知道应该从哪个值范围开始搜索? (即:如果我有 10 个线程,我认为我不必创建 10 个函数 o.O )。是否可以在没有类似
Mutex
的情况下同时使它们 运行?
获取线程 ID 因操作系统而异。
参见how to get thread id of a pthread in linux c program? as @user3078414 mentioned, and why compiler says ‘pthread_getthreadid_np’ was not declared in this scope?。
感谢@Dmitri,这是一个将多个值传递给线程函数的示例。线程 运行 并发。 Mutexes 是另外一章,专门讨论共享数据以及如何访问它。
#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;
}