C 创建和销毁线程

C 创建和销毁线程,c,multithreading,pthreads,C,Multithreading,Pthreads,你好, 我只是想知道这是否是处理由main创建的工作线程/后台线程的最佳方法 我做得对吗?这是我第一次做任何多线程程序。只是想确保我在正确的轨道上,因为这将必须扩展以添加更多线程 我有一个线程用于发送消息,另一个线程用于接收消息 非常感谢您的建议 gcc (GCC) 4.6.3 c89 发送消息的工作线程/后台线程示例,仅示例 int main(void) { pthread_t thread_send; pthread_t thread_recv; int stat

你好,

我只是想知道这是否是处理由main创建的工作线程/后台线程的最佳方法

我做得对吗?这是我第一次做任何多线程程序。只是想确保我在正确的轨道上,因为这将必须扩展以添加更多线程

我有一个线程用于发送消息,另一个线程用于接收消息

非常感谢您的建议

gcc (GCC) 4.6.3
c89
发送消息的工作线程/后台线程示例,仅示例

int main(void)
{
    pthread_t thread_send;
    pthread_t thread_recv;

    int status = TRUE;

    /* Start thread that will send a message */
    if(pthread_create(&thread_send, NULL, thread_send_fd, NULL) == -1) {
        fprintf(stderr, "Failed to create thread, reason [ %s ]",
                strerror(errno));
        status = FALSE;
    }

    if(status != FALSE) {
        /* Thread send started ok - join with the main thread when its work is done */
        pthread_join(thread_send, NULL);

        /* Start thread to receive messages */
        if(pthread_create(&thread_recv, NULL, thread_receive_fd, NULL) == -1) {
            fprintf(stderr, "Failed to create thread for receiving, reason [ %s ]",
                    strerror(errno));
            status = FALSE;

            /* Cancel the thread send if it is still running as the thread receive failed to start */
            if(pthread_cancel(thread_send) != 0) {
                fprintf(stderr, "Failed to cancel thread for sending, reason [ %s ]",
                        strerror(errno));
            }
        }
    }

    if(status != FALSE) {
        /* Thread receive started ok - join with the main thread when its work is done */
        pthread_join(thread_recv, NULL);
    }

    return 0;
}

只有在只有一条消息交换的情况下,这种构造才有可能被证明是正确的,即使这样,也可能存在一些问题

如果要在应用程序运行期间不断交换消息,则更常见的做法是将两个线程都写为循环,并且从不终止它们。这意味着没有持续的创建/终止/销毁开销,也没有死锁生成器(也称为join)。它确实有一个缺点-这意味着您必须参与线程间通信的信号、队列等,但如果您编写许多多线程应用程序,这种情况无论如何都会发生


无论哪种方式,通常都是先启动rx线程。如果您首先启动tx线程,则rx数据有可能在rx线程启动之前被重新调谐和丢弃。

这种构造唯一合理的时间是,如果只交换了一条消息,即使这样,也可能存在一些问题

如果要在应用程序运行期间不断交换消息,则更常见的做法是将两个线程都写为循环,并且从不终止它们。这意味着没有持续的创建/终止/销毁开销,也没有死锁生成器(也称为join)。它确实有一个缺点-这意味着您必须参与线程间通信的信号、队列等,但如果您编写许多多线程应用程序,这种情况无论如何都会发生


无论哪种方式,通常都是先启动rx线程。如果您首先启动tx线程,则在rx线程启动之前,rx数据有可能会被重新调谐并丢弃。

是否每个消息执行一次此操作?这个调用似乎创建了一个线程来发送一条消息,另一个线程来等待一个响应。然后调用,我假设整个程序,只是等待整个事情完成。假设接收者在发送者完成发送之前不能做任何事情,这对提高程序的实际或感知性能绝对没有任何作用。准确地说,我们需要知道发送者和接收者到底在做什么,然后才能确定这是否有任何好处。为了获得任何好处,发送方线程和接收方线程必须同时进行工作,而不是连续进行工作。如果目的是不让程序等待发送和接收事务,则根本不会这样做。

这是每封邮件执行一次吗?这个调用似乎创建了一个线程来发送一条消息,另一个线程来等待一个响应。然后调用,我假设整个程序,只是等待整个事情完成。假设接收者在发送者完成发送之前不能做任何事情,这对提高程序的实际或感知性能绝对没有任何作用。准确地说,我们需要知道发送者和接收者到底在做什么,然后才能确定这是否有任何好处。为了获得任何好处,发送方线程和接收方线程必须同时进行工作,而不是连续进行工作。如果目的是不让程序等待发送和接收事务,那么这根本不能做到这一点

void *thread_send_fd()
{
    /* Send the messages when done exit */

    pthread_exit(NULL);
}