C 如何使用互斥来同步多线程?

C 如何使用互斥来同步多线程?,c,linux,multithreading,pthreads,mutex,C,Linux,Multithreading,Pthreads,Mutex,我是一名学习者,试图建立多线程编程的知识。特别是,我想了解如何将互斥体与pthread一起使用 #include<stdio.h> #include<pthread.h> pthread_mutex_t x,y; static int p=0; void print(char *x) { p++; printf("%d ------ %s\n",p,x); } void * thread_1(char *m) { int i

我是一名学习者,试图建立多线程编程的知识。特别是,我想了解如何将互斥体与pthread一起使用

#include<stdio.h>
#include<pthread.h>
pthread_mutex_t x,y;
static int p=0;
void print(char *x)
{
        p++;
        printf("%d ------ %s\n",p,x);
}
void * thread_1(char *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
                print(m);
        }
}

void * thread_2(char *m)
{
        int i;
        sleep(1);
        for(i=1;i<=10;i++)
        {
                print(m);
        }

}
int main()
{

        pthread_t t1;
        pthread_t t2;
        pthread_mutex_init(&y,NULL);
        pthread_mutex_init(&x,NULL);
        pthread_create(&t1,NULL,thread_1,"thread_1");
        pthread_create(&t2,NULL,thread_2,"thread_2");

        while(1);
}

这当然可以使用互斥锁来完成,但一对信号量更适合于此任务。使用两个信号量,每个信号量都与一个线程相关联,该线程向另一个线程发送消息以通知其轮次。 请注意,线程函数采用的是
void*
,而不是
char*

void * thread_1(void *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
                sem_wait(&sem2);
                print(m);
                sem_post(&sem1);
        }
}

void * thread_2(void *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
                sem_wait(&sem1);
                print(m);
                sem_post(&sem2);
        }
}

int main(void) {
 ...
 sem_init(&sem1, 0, 0);
 sem_init(&sem2, 0, 1);
 ...
}

请明确您想要实现的目标。您需要通过围绕互斥锁对
p
的每次访问,使函数
print
重新进入。理想情况下,保持锁定和解锁之间的代码简短:
lock();p++;int p_copy=p;解锁();printf(…,p_副本)@DevangKubavat为了澄清,请编辑您的问题,而不是发表评论。为什么每个人都试图用线程做的第一件事就是彻底击败线程的全部意义?如果你想让事情以精确的顺序发生,为什么要使用线程@然后,DevangKubavat将互斥用于人们通常使用互斥的事情(提供互斥),并避免以后做与典型用途无关的事情。使用互斥锁的全部目的是在允许线程访问顺序自由的同时保持正确性。如果你不需要这样的自由,你就不需要互斥。但我想了解互斥。。。这就是为什么我用在这里@l3x@DevangKubavat互斥不能保证您想要的结果,因为解锁线程可能是在释放锁后立即再次获取锁的线程。这就是为什么信号量是适合您的用例的正确工具。学习何时使用某些东西也很重要。@DevangKubavat学习互斥体也很好。但您还需要了解手头的任务是否真的需要互斥。我更新了一个使用互斥锁的答案,但这确实是不必要的。@I3x。。。你能举个例子,我可以在哪里使用2个互斥来同步这两个线程。。。。因为我不熟悉同步机制。@DevangKubavat也许,读一本关于pthreads以及何时使用什么构造的教科书吧。搜索互联网。您可以找到大量使用互斥体的示例。
void * thread_1(void *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
                sem_wait(&sem2);
                print(m);
                sem_post(&sem1);
        }
}

void * thread_2(void *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
                sem_wait(&sem1);
                print(m);
                sem_post(&sem2);
        }
}

int main(void) {
 ...
 sem_init(&sem1, 0, 0);
 sem_init(&sem2, 0, 1);
 ...
}
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
int turn = 0;

void print(char *x)
{
        p++;
        printf("%d ------ %s\n",p,x);
}
void * thread_1(void *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
           pthread_mutex_lock(&mutex);
           while (turn != 0)
              pthread_cond_wait(&cond, &mutex);
           print(m);
           turn = 1;
           pthread_cond_signal(&cond);
           pthread_mutex_unlock(&mutex);
        }
}

void * thread_2(void *m)
{
        int i;
        for(i=1;i<=10;i++)
        {
            pthread_mutex_lock(&mutex);
            while (turn != 1)
               pthread_cond_wait(&cond, &mutex);
            print(m);
            turn = 0;
            pthread_cond_signal(&cond);
            pthread_mutex_unlock(&mutex);
        }
}