如何解决创建多线程并根据条件递增计数器
我正在尝试在 C 中编写一个名为 thr_incrementer 的函数,使变量由 N 个任务递增(N 由一个常量定义)。每个任务都分配了一个 id 标识符(介于 0 和 N-1 之间),并且它们仅在
id = 计数器 % N
现在我有这个,但是,id = (counter % NTHREADS)
根本不起作用。
#include<stdio.h>
#include<pthread.h>
#define NTHREADS 10
void *thr_incrementer(void *);
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int counter =0;
void *thr_incrementer(void *arg){
int id = 0;
pthread_mutex_lock (&mutex);
for(id = 0; id <NTHREADS ; id++){
if (id == (counter % NTHREADS)){
counter++;
}
else{
return NULL;
}
}
pthread_mutex_unlock(&mutex);
printf("ID: %d\n",id);
}
int main(){
pthread_t thread[NTHREADS];
int i;
for ( i = 0; i < NTHREADS; i++){
pthread_create(&thread[i],NULL,thr_incrementer,NULL);
}
if(pthread_mutex_destroy(&mutex) != 0){
printf("Error destorying mutex.\n");
return -1;
}
printf("Thread: %ln\n",thread);
}
解决方法
现在我有这个,但是,id = (counter % NTHREADS)
[原文如此] 根本不起作用。
当然,您代码中的测试实际上是id == (counter % NTHREADS)
(==
与=
不同)。该测试工作正常,但在给出的代码中毫无意义。考虑:
-
counter
最初取值为 0int counter =0;
-
每个线程都有自己的本地变量
id
,它最初取值为 0,每个线程在运行时都会修改该变量。这与问题描述的“每个任务都分配了一个 id 标识符”不匹配,代码中似乎也没有任何其他内容与该规定匹配。 -
每个线程基本上完成其所有工作,包括对单个关键区域内的全局
counter
变量的所有修改。因此,不会交错其他线程的操作。 -
每个线程在循环中递增其
id
变量。如果发生id == (counter % NTHREADS)
,那么它也会增加counter
。在这种情况下,该条件也将在下一次迭代中得到满足,因为id
和 counter` 都会增加 1。 -
此外,
id
在每个线程中从 0 开始,而counter
在整个程序中从 0 开始。因此,第一个线程将增加counter
的次数与它总共增加id
--NTHREADS
次一样多。NTHREADS % NTHREADS
为 0,因此当每个后续线程获取互斥锁时,同样的事情会再次发生。
因此问题不在于 id == (counter % NTHREADS)
不起作用,而是在于,鉴于您的代码,它在评估时始终为真。
我最好的猜测是,您希望每个线程在自己的回合中仅递增 counter
一次。为此,您需要
-
以将分配的标识符传达给每个线程的方式实现“每个任务都分配了一个 id 标识符”的规范。为不同的线程提供不同的数据通常涉及使用
pthread_create()
的第四个参数,线程函数接收它作为它的(唯一)参数。 -
使用条件变量和互斥锁来使线程在等待轮到它们时暂停操作。您可以在 SO 上找到许多有关如何正确执行此操作的答案。
-
当一个线程轮到计数器递增时,它只执行一次递增,而不是多次递增,并且不会修改自己分配的 ID。
还有很多细节需要您解决。我将这些作为他们打算进行的练习。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。