我有三个整数(a,b和c),我想创建两个线程( POSIX pthreads )以按照这个特定的顺序访问它们以保持结果一致:
Thread 1 | Thread 2
---------------------
a=1 b=5
c=7
c=c+10
b=a+c*2
a=b+b*10
也就是说,thread2中的c = c + 10必须等到thread1中的c = 7结束。而thread1中的a = b + b * 10必须等到thread2完成时b = a + c * 2。
我已经尝试过使用互斥锁,但它并不像我想的那样工作(下面的代码)。如果thread2首先启动,它可以在thread1锁定之前锁定mutex1,因此排序会丢失。从主线程锁定互斥锁不是一个选项,因为它会产生一个未定义的行为(互斥锁被锁定然后由另一个线程解锁)。我也尝试使用条件变量,但是出现了类似的问题:信号可能在相关的等待之前发生。
#include <pthread.h>
#include <stdio.h>
int a, b, c;
pthread_mutex_t mutex1, mutex2 = PTHREAD_MUTEX_INITIALIZER;
void *thread1(void *arg) {
pthread_mutex_lock(&mutex1);
a = 1;
c = 7;
pthread_mutex_unlock(&mutex1);
pthread_mutex_lock(&mutex2);
a = b + b*10;
pthread_exit(NULL);
}
void *thread2(void *arg) {
pthread_mutex_lock(&mutex2);
b = 5;
pthread_mutex_lock(&mutex1);
c = c + 10;
b = a + c*2;
pthread_mutex_unlock(&mutex2);
pthread_exit(NULL);
}
int main() {
pthread_t t1, t2;
if(pthread_create(&t1, NULL, thread1, NULL)) {
fprintf(stderr, "Error creating Thread 1\n");
return 0;
}
if(pthread_create(&t2, NULL, thread2, NULL)) {
fprintf(stderr, "Error creating Thread 2\n");
return 0;
}
pthread_join(t1, NULL);
pthread_join(t2, NULL);
return a;
}
我的问题是,使用pthreads实现线程排序的正确方法是什么?提前谢谢。
答案 0 :(得分:0)
pthread_mutex_t mutex1, mutex2 = PTHREAD_MUTEX_INITIALIZER
仅初始化第二个;但这是一个不错的选择。根据您运行的系统,您可能不会注意到这一点,因为mutex1未初始化,因此对它的操作可能失败,或者初始化程序常量可能为零....
信号/等待问题不是问题 - 您等待受互斥锁保护的条件,在这种模式中:
lock();
while (check() == false) {
wait();
}
func();
signal();
unlock();
所以thread1的检查是真的,而func将是c = 7 而thread2的检查将是(c == 7),而func将是c + = 10