我是学习者,试图建立多线程编程的知识。特别是,我想了解如何将互斥锁与pthreads一起使用。
web.config
我创建了两个线程,现在我正在尝试同步它们。我应该在哪里使用两个互斥锁进行锁定和解锁?
我想这样输出:
#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);
}
答案 0 :(得分:3)
这当然可以使用互斥锁来完成,但是一对信号量更适合此任务。使用两个信号量,每个信号量与一个线程相关联,该线程发布到另一个线程以通知其轮流。
请注意,线程函数需要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);
...
}
sleep()
电话是不必要的。你也不需要在main()线程中有一个无限循环。如果您希望完成线程,请使用pthread_join()
。或者只需拨打pthread_exit(0);
而不是while(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);
}
}