Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用pthread的简单死锁示例_C_Pthreads_Deadlock - Fatal编程技术网

C 使用pthread的简单死锁示例

C 使用pthread的简单死锁示例,c,pthreads,deadlock,C,Pthreads,Deadlock,我试图通过使用两个资源rs1和rs2的简单示例来理解死锁,这两个资源都有自己的互斥锁,因此proc1锁定resource1并尝试获取resource2,同时proc2锁定resource2并尝试获取resource1,因此两者都处于死锁状态。下面的程序显示了死锁场景,但问题是为什么“p1尝试获取rs2”和“p2绑定获取rs1”不分别由proc1和proc2打印 #include<pthread.h> #include<stdio.h> #include<stdlib

我试图通过使用两个资源rs1和rs2的简单示例来理解死锁,这两个资源都有自己的互斥锁,因此proc1锁定resource1并尝试获取resource2,同时proc2锁定resource2并尝试获取resource1,因此两者都处于死锁状态。下面的程序显示了死锁场景,但问题是为什么“p1尝试获取rs2”和“p2绑定获取rs1”不分别由proc1和proc2打印

#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>

pthread_mutex_t resource1,resource2;
int test=0;
void *proc1()
{
    printf("\nThis is proc1 using rs1");
    pthread_mutex_lock(&resource1);
        usleep(200);
        printf("\np1 trying to get rs2..."); 
        pthread_mutex_lock(&resource2);
            test++;
        printf("\nproc1 got rs2!!");    
        pthread_mutex_unlock(&resource2);   
     pthread_mutex_unlock(&resource1);  
return 0;
}

void *proc2()
{
    printf("\nThis is proc2 using rs2");
    pthread_mutex_lock(&resource2);
        usleep(200);
        printf("\np2 trying to get rs1..."); 
        pthread_mutex_lock(&resource1);
            test--;
        printf("\nproc2 got rs1!!");    
        pthread_mutex_unlock(&resource1);   
     pthread_mutex_unlock(&resource2);  
return 0;
}

int main(){
    pthread_t t1,t2;
    pthread_mutex_init(&resource1, NULL);
    pthread_mutex_init(&resource2, NULL);

    pthread_create(&t1,NULL, proc1 , NULL);
    pthread_create(&t2,NULL, proc2 , NULL);

    pthread_join(t1,NULL);  
    pthread_join(t2,NULL);
// will never arrive here
    pthread_mutex_destroy(&resource1);
    pthread_mutex_destroy(&resource2);
}
#包括
#包括
#包括
pthread_mutex_t resource1、resource2;
int检验=0;
void*proc1()
{
printf(“\n这是使用rs1的proc1”);
pthread_mutex_lock(&resource1);
usleep(200);
printf(“\np1试图获取rs2…”);
pthread_mutex_lock(&resource2);
测试++;
printf(“\nproc1得到rs2!!”;
pthread_mutex_unlock(&resource2);
pthread_mutex_unlock(&resource1);
返回0;
}
void*proc2()
{
printf(“\n这是使用rs2的proc2”);
pthread_mutex_lock(&resource2);
usleep(200);
printf(“\np2正在尝试获取rs1…”);
pthread_mutex_lock(&resource1);
测试--;
printf(“\nproc2得到rs1!!”;
pthread_mutex_unlock(&resource1);
pthread_mutex_unlock(&resource2);
返回0;
}
int main(){
pthread_t t1,t2;
pthread_mutex_init(&resource1,NULL);
pthread_mutex_init(&resource2,NULL);
pthread_create(&t1,NULL,proc1,NULL);
pthread_create(&t2,NULL,proc2,NULL);
pthread_join(t1,NULL);
pthread_join(t2,NULL);
//永远不会到这里
pthread_mutex_destroy(&resource1);
pthread_mutex_destroy(&resource2);
}

这可能与您打印邮件的方式有关
stdout
是行缓冲的,这意味着在换行时刷新缓冲区。尝试在打印的字符串中最后添加一个换行符,或者使用
fflush
显式刷新缓冲区。
–某个程序员伙计

你有没有试着冲洗一下标准装置?我不能复制,我从两者都得到打印。这可能与你打印信息的方式有关
stdout
是行缓冲的,这意味着在换行时刷新缓冲区。尝试在打印的字符串中最后添加一个换行符,或者显式地刷新缓冲区。如果将换行符放在末尾,您可能会看到输出。原因是默认情况下输出是行缓冲的。它现在通过刷新标准输出工作,谢谢大家!!!
//This program executes in order, have a look

pthread_mutex_t lock1, lock2;

void *resource1(){

    pthread_mutex_lock(&lock1);

    printf("Job started in resource1..\n");
    sleep(2);

    printf("Trying to get resourc2\n");
    pthread_mutex_lock(&lock2); 
    printf("Aquired resourc2\n");
    pthread_mutex_unlock(&lock2);

    printf("Job finished in resource1..\n");

    pthread_mutex_unlock(&lock1);

    pthread_exit(NULL);

}

void *resource2(){

    pthread_mutex_lock(&lock2);

    printf("Job started in resource2..\n");
    sleep(2);

    printf("Trying to get resourc1\n");
    pthread_mutex_lock(&lock1); 
    printf("Aquired resourc1\n");
    pthread_mutex_unlock(&lock1);

    printf("Job finished in resource2..\n");

    pthread_mutex_unlock(&lock2);

    pthread_exit(NULL);

}



int main() {

    pthread_mutex_init(&lock1,NULL);
    pthread_mutex_init(&lock2,NULL);

    pthread_t t1,t2;

    pthread_create(&t1,NULL,resource1,NULL);
    pthread_create(&t2,NULL,resource2,NULL);

    pthread_join(t1,NULL);
    pthread_join(t2,NULL);

    return 0;

}