【问题标题】:Regarding threading关于穿线
【发布时间】:2012-02-28 05:32:38
【问题描述】:

我面临一个关于线程场景的问题。

我的进程中有三个线程。一个是subsystem1 线程,第二个是subsystem2 线程,第三个是store manager 线程。

subsystem1 和subsystem2 线程都调用storemanager 线程与数据库进行通信。

谁能帮助我如何调用 storemanager 线程方法或如何传递命令以从我的 sybsystem 线程调用 store manager 线程方法并从 store manager 线程获取响应。

需要这方面的指导。我在 linux 中使用 c++。

【问题讨论】:

  • 你基本上是在问如何从另一个线程(子系统)调用一个线程(storeManager)吗?
  • 是的...我需要从其他线程调用 storemanager 线程中的方法。假设在 storemanager 线程中有一个名为“Write”的方法。其他线程将调用此写入并传递参数并获取返回响应。我需要这种行为。
  • 添加标签c或c++,你会得到更多的答案。
  • @noMAD:不要为了获得更多答案而添加标签。标签是为了总结问题中的领域,而不是为了吸引注意力。
  • 可能是message queues?

标签: c++ multithreading thread-safety pthreads


【解决方案1】:

没有从另一个线程“调用”一个线程这样的事情。您的三个线程同时运行且彼此独立。

您的商店经理线程充当工作线程,为其他两个线程的请求提供服务。

当其中一个子系统线程需要发出数据库操作时,它会向存储管理器线程发送某种形式的消息,其中包含有关需要执行的函数的信息。实现这种通信的一种方法是使用线程安全队列。在这种情况下,子系统线程会将作业请求添加到作业队列中。

存储管理器线程监视作业队列并在其他线程添加时执行队列中的作业请求。已完成的作业将从队列中移除。

请注意,当存储管理器线程执行请求的任务时,子系统线程不会阻塞。相反,您必须在线程之间开发一种通信机制,子系统线程可以通过该机制发现作业何时完成,并在必要时获取有关结果的信息。

我建议您阅读线程安全数据结构和同步原语。

【讨论】:

    【解决方案2】:
    void *storeManager(void *arg)
    {
        printf("\nI am storeManager function\n");
        pthread_exit(NULL);
    }
    
    void *subSystem(void *arg)
    {
       pthread_t newThread;
       printf("I am subSystem function\n");
       pthread_create(&newThread, NULL, storeManager, NULL);
       pthread_exit(NULL);
    }
    
    
    int main (int argc, char *argv[])
    {
       pthread_t threads;
       printf("In main: creating subSystem thread\n");
       pthread_create(&threads, NULL, subSystem, NULL);
       pthread_exit(NULL);
    }
    

    【讨论】:

    • 在这里您正在创建新线程。但是假设两个线程已经在运行,那么如何从另一个线程调用一个线程的方法来分配任务呢?
    • 您只能创建一个线程并为其分配一个方法。当一个线程已经在运行时,你不能像普通方法一样简单地调用它。 POSIX API 有一个pthread_create 函数来创建一个线程并为其分配一个方法。如果要将新方法或相同方法分配给另一个线程,则需要创建一个新线程。我希望你明白我的意思。
    • 但是我还是不明白你的意思。如果你有一个单独的方法write(),那么你可以在任意数量的线程内部或外部调用它(只要确保它们没有进入竞争条件)。如果你有一个方法void *write(void *arg),那么我知道调用它的唯一方法是pthread_create()
    • 他可能在寻找信号或条件机制?取决于其他线程在等待子系统命令时是否倾向于阻塞或什么...
    • @Platinum :在信号或条件机制中,您不能将参数传递给目标线程。您只能发出继续或不继续的信号。
    猜你喜欢
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    相关资源
    最近更新 更多