繁体   English   中英

如何使一个pthread发出另一个可以继续执行的信号?

[英]How to make a pthread signal another that it can continue executing?

我有三个整数(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

也就是说,线程2中的c = c + 10必须等待,直到线程1中的c = 7完成。 另外,线程1中的a = b + b * 10必须等待,直到线程2中的b = a + c * 2完成。

我已经尝试过使用互斥锁,但是它不能按我的预期工作(下面的代码)。 如果先启动线程2,则可以在线程1锁定互斥锁之前锁定互斥锁1,因此序列丢失。 从主线程锁定互斥锁不是一种选择,因为它将产生未定义的行为(互斥锁被锁定,然后由另一个线程解锁)。 我也尝试过使用条件变量,但是会出现类似的问题:在关联的等待之前可能会发生信号。

#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实现线程排序的正确方法是什么? 提前致谢。

pthread_mutex_t mutex1, mutex2 = PTHREAD_MUTEX_INITIALIZER

仅初始化第二个; 但这是一种选择。 取决于您正在运行的系统,您可能不会注意到这一点,因为Mutex1未初始化,因此对其进行的操作可能会失败,或者初始化程序常量可能为零。

信号/等待问题不是问题-您以这种模式等待由互斥锁保护的条件:

lock();
while (check() == false) {
    wait();
}
func();
signal();
unlock();

因此thread1的检查为true,func为c = 7,而thread2的检查为(c == 7),func为c + = 10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM