linux多线程问题
/* * 编写程序完成如下功能:
* (1)有一int型全局变量g_Flag初始值为0
* (2)在主线程中创建线程1,打印“this is thread1”,并将g_Flag设置为1
* (3)在主线程中创建线程2,打印“this is thread2”,并将g_Flag设置为2
* (4)线程1需要在线程2退出后才能退出
* (5)主线程在检测到g_Flag从1变为2,或者2变为1的时候退出
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
int g_Flag = 0;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// 线程1在线程2退出后退出
void print_change1(void *arg) {
printf("this is thread1\n");
// 进入临界区,设置g_Flag
pthread_mutex_lock(&mutex);
if(g_Flag == 2) {
pthread_cond_signal(&cond);
}
g_Flag = 1;
pthread_mutex_unlock(&mutex);
// 等待线程2结束
pthread_join(*(pthread_t *)arg, NULL);
printf("线程1等到线程2结束了!\n");
//printf("thread1 exit\n");
pthread_exit(0);
}
void print_change2(void *arg) {
printf("this is thread2\n");
// 进入临界区,设置g_Flag
pthread_mutex_lock(&mutex);
if(g_Flag == 1) {
pthread_cond_signal(&cond);
}
g_Flag = 2;
pthread_mutex_unlock(&mutex);
printf("thread2 exit\n");
pthread_exit(0);
}
int main() {
int ret;
pthread_t t1, t2;
// 创建线程
ret = pthread_create(&t2, NULL, (void *)print_change2, NULL);
ret = pthread_create(&t1, NULL, (void *)print_change1, &t2);
// 等待条件变量,然后退出
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond, &mutex);
pthread_mutex_unlock(&mutex);
printf("main exit\n");
exit(0);
}
为什么“线程1等到线程2结束了!”会打印两次?求解!
回答:
我想知道你这里是在linux下运行的吗
win上模拟的linux接口容易出一些奇奇怪怪的东西
回答:
我测试了不会啊。不过你的代码有点问题,main都退出了,还有创建的子线程还没退出。应该等所有子线程退出main再退出。否则各个平台情况可能都不同,看具体实现。
回答:
你这么写,有可能线程1还没结束主线程就退出了。也有可能两个线程都还没结束,主线程就退出了。
以上是 linux多线程问题 的全部内容, 来源链接: utcz.com/p/194647.html