POSIX 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

我是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 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。请不要忘记回答你的问题。