我有一个很大的问题,我无法弄清楚为什么C中的互斥体不能像我期望的那样工作。 这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_t mythread;
pthread_mutex_t mymutex;
void *anotherFunc(void*)
{
pthread_mutex_lock(&mymutex);
for(int i = 0; i < 100; i++)
printf("anotherFunc\n");
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
void *func(void*)
{
pthread_mutex_lock(&mymutex);
for(int i = 0; i < 100; i++)
printf("func\n");
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_mutex_init(&mymutex, NULL);
pthread_create(&mythread, NULL, func, NULL);
pthread_create(&mythread, NULL, anotherFunc, NULL);
pthread_mutex_destroy(&mymutex);
pthread_exit(NULL);
return EXIT_SUCCESS;
}
我期望发生的是首先打印100&#34; func&#34;消息然后100&#34; anotherFunc&#34;消息。我期望执行到达func并锁定互斥锁。当执行到达anotherFunc时,我希望等到func解锁互斥锁。但我得到像
这样的干扰信息FUNC FUNC FUNC anotherFunc anotherFunc anotherFunc FUNC anotherFunc
我不明白这件事是如何运作的。请帮忙!
答案 0 :(得分:16)
pthread_create(&mythread, NULL, func, NULL); pthread_create(&mythread, NULL, anotherFunc, NULL); pthread_mutex_destroy(&mymutex);
在线程完成之前你正在销毁互斥锁,所以所有的赌注都是关闭的。在破坏之前你可能想要pthread_join
2个线程。
答案 1 :(得分:2)
我收到了很少的编辑错误
我无法在中为循环声明 int i
使用参数名称 arg 作为线程“func”和“anotherFunc”的参数
我之前使用 pthread_join 销毁互斥锁。
这样在线程“func”和“anotherFunc”完成执行后,我正在销毁我的互斥锁“mymutex”
此外,每个线程现在都有自己的线程ID “mythread1”和“mythread2”所以这样我就可以为每个线程使用pthread_join()函数
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
pthread_t mythread1, mythread2;
pthread_mutex_t mymutex;
void *anotherFunc(void *arg)
{
pthread_mutex_lock(&mymutex);
int i;
for(i = 0; i < 100; i++)
printf("anotherFunc\n");
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
void *func(void *arg)
{
pthread_mutex_lock(&mymutex);
int i;
for(i = 0; i < 100; i++)
printf("func\n");
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_mutex_init(&mymutex, NULL);
pthread_create(&mythread1, NULL, func, NULL);
pthread_create(&mythread2, NULL, anotherFunc, NULL);
pthread_join(mythread1, NULL);
pthread_join(mythread2, NULL);
pthread_mutex_destroy(&mymutex);
return EXIT_SUCCESS;
}