POSIX C程序(互斥程序)
我是C编程的初学者,我正在尝试在下面的程序上执行互斥,但是我没有得到正确的输出POSIX C程序(互斥程序),c,pthreads,C,Pthreads,我是C编程的初学者,我正在尝试在下面的程序上执行互斥,但是我没有得到正确的输出 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define NUM_THREAD 4 void *func(void *p); int counter=0,a=2; pthread_mutex_t mutexsum = PTHREAD_MUTEX_INITIALIZER; main() { int
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NUM_THREAD 4
void *func(void *p);
int counter=0,a=2;
pthread_mutex_t mutexsum = PTHREAD_MUTEX_INITIALIZER;
main()
{
int i,rc;
pthread_t threadid[NUM_THREAD];
for(i = 0; i< NUM_THREAD; i++)
{
a = a + i;
printf("Value of a is %d\n",a);
rc = pthread_create(&threadid[i],NULL,func,(void *)a);
if(rc)
{
printf("Error in thred creation thread[%d] %d",i,rc);
}
}
for(i = 0; i< NUM_THREAD; i++)
{
pthread_join(threadid[i],NULL);
}
printf("Final value of counter is %d\n",counter);
pthread_exit(NULL);
}
void *func(void *p)
{
int i;
i = (int) p;
pthread_mutex_lock(&mutexsum);
counter = counter+a;
printf("%d\n",counter);
pthread_mutex_unlock(&mutexsum);
pthread_exit(NULL);
}
#包括
#包括
#包括
#定义NUM_线程4
void*func(void*p);
int计数器=0,a=2;
pthread_mutex_t mutexsum=pthread_mutex_初始值设定项;
main()
{
int i,rc;
pthread_t threadid[NUM_THREAD];
对于(i=0;i
根据上述程序和我的理解,所需的输出将是18,但它给出了32。
func
使用a
进行增量。我猜你的意思是增加I
。实际上,在每个线程运行时,a
必须是其最终值8,因此您将向计数器添加8四次。func
使用a
递增。我猜你的意思是增加I
。实际上,在每个线程运行时,a必须是它的最终值8,因此您将向计数器添加8四次。您在线程函数中使用的不是i,而是a。您在线程函数中使用的不是i,而是a。亲爱的Marcelo,谢谢你的回复。是的,它为每个线程使用了一个i.e.8的值。这意味着首先创建所有线程,然后它使用了一个i.e.8的最终值。但与此相反,我想使用来自for循环每次迭代的一个i.e.的新值。例如,当i的值为0时,a的值变为2,因此我希望线程[1]将使用2而不是8。类似地,当i=1时,a的值变为3,因此线程[2]的值为3。我希望现在一切都清楚了。如果你需要我方进一步澄清,请让我通知你。提前谢谢!!!。也许我的答案不清楚。将计数器+a
替换为计数器+i
。而且,a
不需要是全局的;将其移动到main()
中。亲爱的Marcelo,非常感谢您的回复,请为我提供一些pthread教程的链接。再次感谢您的回复。这就像谷歌搜索“pthreads教程”一样简单。然而,我不知道有哪个pthreads教程能让您很好地掌握并发编程的原理。坦率地说,作为初学者,你应该完全避免线程。虽然从表面上看,它们是一个相当直截了当的概念,但在表面之下潜伏着无数的陷阱。许多大型和有用的系统完全没有线程,线程并不是唯一可用的并发机制。有关更多信息,请参阅。亲爱的Marcelo,谢谢你的回复。是的,它为每个线程使用了一个i.e.8的值。这意味着首先创建所有线程,然后它使用了一个i.e.8的最终值。但与此相反,我想使用来自for循环每次迭代的一个i.e.的新值。例如,当i的值为0时,a的值变为2,因此我希望线程[1]将使用2而不是8。类似地,当i=1时,a的值变为3,因此线程[2]的值为3。我希望现在一切都清楚了。如果你需要我方进一步澄清,请让我通知你。提前谢谢!!!。也许我的答案不清楚。将计数器+a
替换为计数器+i
。而且,a
不需要是全局的;将其移动到main()
中。亲爱的Marcelo,非常感谢您的回复,请为我提供一些pthread教程的链接。再次感谢您的回复。这就像谷歌搜索“pthreads教程”一样简单。然而,我不知道有哪个pthreads教程能让您很好地掌握并发编程的原理。坦率地说,作为初学者,你应该完全避免线程。虽然从表面上看,它们是一个相当直截了当的概念,但在表面之下潜伏着无数的陷阱。许多大型和有用的系统都是完全没有线程编写的,线程并不是唯一可用的并发机制。有关更多信息,请参阅。欢迎使用堆栈溢出。请不要忘记回答您的问题。欢迎来到Stack Overflow。请不要忘记回答你的问题。