当前位置: 首页 > 知识库问答 >
问题:

加密和互斥初始化

蒙华翰
2023-03-14

我正在努力解决这个问题。所以我几乎编写了整个代码,但问题是我无法初始化监视器(我编写了伪代码,我用c重新编写),所以我无法测试程序。谁能帮我说说监视器/互斥体初始化有什么问题吗?

我在第18行得到错误,它是这样的:error:'intpthread\u mutex\u init'被重新声明为不同类型的符号

将其更改为int pthread_mutex_init(

通过添加int pthread_mutex_init(pthread_mutex_t*monitor,NULL);

我得到错误:预期的标识符之前'__null'

#include <iostream>
#include <cstdio>
#include <pthread.h>
#include <cstdlib>
#include <unistd.h>

using namespace std;


char v_filozofi[5]={'O'};   //vizualni prikaz filozofa
int stapic[5]={1};          //stapici za filozofe
int broj[5];                //shema koju sam mora sloziti da imam broj filozofa

pthread_t       d_filozofi[5]; //dretve filozofa,philosopher's thread
pthread_cond_t  red_uvjeta[5];  
pthread_mutex_t monitor;        //deklariramo monitor,tj mymutex

int pthread_mutex_init(*monitor,NULL);

void ispisi_stanje(int n){
    for(int i = 0; i < 5 ;i++)  cout<< v_filozofi[i];
    cout<<"("<< n+1 << ")" <<endl;  
}

void misliti(int n){
    cout<<"Mislim " << endl;
    sleep(4);
}

void jesti(int n){
    pthread_mutex_lock(&monitor);
        v_filozofi[n]='o';
        while(stapic[n]==0 || stapic[n+1]%5==0){//gleda ima li lijevi i desni
        //stapic na raspolaganju
            pthread_cond_wait(&red_uvjeta[n],&monitor);
        }
        stapic[n] = stapic[(n+1)%5] = 0;
        v_filozofi[n] = 'X';

        ispisi_stanje(n);

    pthread_mutex_unlock(&monitor);
    sleep(2);
    pthread_mutex_lock(&monitor);
        v_filozofi[n] = 'O';

        stapic[n] = stapic[(n+1)%5] = 1; 

        pthread_cond_signal(&red_uvjeta[(n-1)%5]);
        pthread_cond_signal(&red_uvjeta[(n+1)%5]);

        ispisi_stanje(n);
    pthread_mutex_unlock(&monitor);


}

void * filozof(void *n){
    int br_fil = *((int *)n);
    while(1){
        misliti(br_fil);
        jesti(br_fil);
    }   
return 0;
}   

//MAIN  
int main(){
for(int i=0;i<5;i++){
    broj[i] = i;
    pthread_cond_init(&red_uvjeta[i],NULL);
    }
for(int i=0;i<5;i++){
    sleep(1);
    pthread_create( &d_filozofi[i],NULL,filozof,&broj[i]);
    }

for(int i=0;i<5;i++) pthread_join(d_filozofi[i],NULL);
pthread_mutex_destroy(&monitor);

return 0;
}

共有3个答案

邹开畅
2023-03-14

一旦看了这个很好地给出

http://nitish712.blogspot.in/search/label/mutex

http://nitish712.blogspot.in/2012/09/classical-ipc-problems.html

邹誉
2023-03-14

这个函数需要一个指针,为什么在调用之前加上“int”?我认为您混淆了原型(这是不必要的)和对函数的实际调用。

int pthread_mutex_init(*monitor,NULL);

所以:

pthread_mutex_init(&monitor,NULL);

http://pubs.opengroup.org/onlinepubs/7908799/xsh/pthread_mutex_init.html

高修伟
2023-03-14

去掉线

int pthread_mutex_init(*monitor,NULL);

而是

pthread_mutex_init(&monitor,NULL); 

在主函数的开头。(并检查它是否返回0)

事实上,您正在声明函数而不是调用它,并且由于它已经声明,您将得到一个错误

 类似资料:
  • Go语言包中的 sync 包提供了两种锁类型:sync.Mutex 和 sync.RWMutex。 Mutex 是最简单的一种锁类型,同时也比较暴力,当一个 goroutine 获得了 Mutex 后,其他 goroutine 就只能乖乖等到这个 goroutine 释放该 Mutex。 RWMutex 相对友好些,是经典的单写多读模型。在读锁占用的情况下,会阻止写,但不阻止读,也就是多个 gor

  • 问题内容: 阅读有关锁定PHP的一些文章。 它们主要都直接指向http://php.net/manual/en/function.flock.php。 本页讨论如何在硬盘上打开文件! 真的是这样吗?我的意思是,这使锁定变得非常昂贵-这意味着每次要锁定时,我都必须访问硬盘)= 能再给我一个令人愉快的消息安慰我吗? 编辑: 由于我已经收到了一些答复,我想问这个。 我的脚本只能由一个或多个线程运行?因为

  • 问题内容: 我有一个关于在AES加密中使用初始化向量的问题。我引用以下文章/帖子将加密功能构建到程序中: [1] 基于Java256位AES密码的加密 [2]http://gmailassistant.sourceforge.net/src/org/freeshell/zs/common/Encryptor.java.html 我最初从第一个链接开始关注erickson的解决方案,但是据我所知,我

  • 问题内容: 我想知道Node.js中的数据访问是否需要互斥锁/锁。例如,假设我已经创建了一个简单的服务器。服务器提供了几种协议方法,可以添加到内部阵列中或从内部阵列中删除。我需要使用某种互斥量保护内部阵列吗? 我了解Javascript(因此Node.js)是单线程的。我只是不清楚事件的处理方式。事件会中断吗?如果真是这样,我的应用程序可能正在读取数组的过程中,被打断以运行事件回调以更改数组,然后

  • 互斥是多线程系统中用于控制访问的一个原对象(primitive object)。下面的例子给出了它最基本的用法: std::mutex m; int sh; //共享数据 // … m.lock(); // 对共享数据进行操作: sh += 1; m.unlock(); 在任何时刻,最多只能有一个线程执行到lock()和unlock()之间的区域(通常称为临界区)。当第一个线程正在临界区执行时

  • 上面的例子中,我们看过了如何在多个协程之间原子地访问计数器,对于更复杂的例子,我们可以使用Mutex来在多个协程之间安全地访问数据。 package main import ( "fmt" "math/rand" "runtime" "sync" "sync/atomic" "time" ) func main() { // 这个例子的状态就