- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 C 语言进行线程练习,这是许多学校教授的典型线程调度代码,基本的代码可以在这里看到,我的代码基本上是相同的,除了我改变了 runner 方法 http://webhome.csc.uvic.ca/~wkui/Courses/CSC360/pthreadScheduling.c
我所做的基本上是改变运行者部分,以便我的代码打印一个包含一定范围内的随机数的数组,而不是仅仅打印一些单词。我的运行者代码在这里:
void *runner(void *param) {
int i, j, total;
int threadarray[100];
for (i = 0; i < 100; i++)
threadarray[i] = rand() % ((199 + modifier*100) + 1 - (100 + modifier*100)) + (100 + modifier*100);
/* prints array and add to total */
for (j = 0; j < 100; j += 10) {
printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", threadarray[j], threadarray[j+1], threadarray[j+2], threadarray[j+3], threadarray[j+4], threadarray[j+5], threadarray[j+6], threadarray[j+7], threadarray[j+8], threadarray[j+9]);
total = total + threadarray[j] + threadarray[j+1] + threadarray[j+2] + threadarray[j+3] + threadarray[j+4] + threadarray[j+5] + threadarray[j+6] + threadarray[j+7] + threadarray[j+8] + threadarray[j+9];
}
printf("Thread %d finished running, total is: %d\n", pthread_self(), total);
pthread_exit(0);
}
我的问题在于第一个 for 循环,我在其中为数组分配随机数,我希望此修饰符根据它所在的线程进行更改,但我不知道如何执行此操作,例如,如果第一个线程的范围为 100-199,第二个线程的范围为 200-299,依此类推。我尝试在执行 pthread_create 之前将 i 分配给一个值,并将该值分配给 runner 中的 int 以用作修饰符,但由于有 5 个并发线程,因此最终会将此数字分配给所有 5 个线程,并且它们最终会得到相同的修饰符。
所以我正在寻找一种方法来解决这个问题,它将适用于所有单独的线程,而不是将其分配给所有线程,我尝试将参数更改为类似 (void *param, int 修饰符)
但当我这样做时,我不知道如何引用 runner,因为默认情况下它的引用方式类似于 pthread_create(&tid[i],&attr,runner,NULL);
最佳答案
您想让param
指向一个数据结构或变量,其生命周期将比线程生命周期长。然后将 void*
参数转换为其分配的实际数据类型。
简单的例子:
struct thread_data
{
int thread_index;
int start;
int end;
}
struct thread_info;
{
struct thread_data data;
pthread_t thread;
}
struct thread_info threads[10];
for (int x = 0; x < 10; x++)
{
struct thread_data* pData = (struct thread_data*)malloc(sizeof(struct thread_data)); // never pass a stack variable as a thread parameter. Always allocate it from the heap.
pData->thread_index = x;
pData->start = 100 * x + 1;
pData->end = 100*(x+1) - 1;
pthread_create(&(threads[x].thread), NULL, runner, pData);
}
然后你的运行者:
void *runner(void *param)
{
struct thread_data* data = (struct thread_data*)param;
int modifier = data->thread_index;
int i, j, total;
int threadarray[100];
for (i = 0; i < 100; i++)
{
threadarray[i] = ...
}
关于c - 如何将特定值传递给一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40065620/
我是一名优秀的程序员,十分优秀!