gcc (GCC) 4.6.3
c89
您好,
我只是想知道这是否是处理main创建的工作/后台线程的最佳方法?
我这样做对吗?这是我第一次做任何多线程程序。只是想确保我在正确的轨道上,因为必须扩展它以添加更多线程。
我有一个用于发送消息的线程和另一个用于接收消息的线程。
非常感谢任何建议,
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;
}
发送消息的工作者/后台线程示例,仅示例
void *thread_send_fd()
{
/* Send the messages when done exit */
pthread_exit(NULL);
}
答案 0 :(得分:2)
唯一一次这种结构可能是合理的,如果只有一条消息被交换,即使这样,也可能存在一些问题。
如果要在应用程序运行期间不断地交换消息,则通常将两个线程都写为循环并且永远不会终止它们。这意味着没有连续的创建/终止/销毁开销,也没有死锁生成器(AKA连接)。它确实有一个缺点 - 这意味着您必须参与线程间通信的信号,队列等,但如果您编写许多多线程应用程序,这种情况无论如何都会发生。
无论哪种方式,通常首先启动rx线程。如果先启动tx线程,则有可能在rx线程启动之前重新调整并丢弃rx数据。
答案 1 :(得分:1)
每封邮件是否完成一次?似乎调用创建一个线程来发送1个消息,另一个线程等待1个响应。然后是电话,我假设整个节目,等待整个事情完成。假设接收方在发送方完成发送之前无法执行任何操作,这对于提高程序的实际或感知性能绝对没有任何作用。现在确切地说,在我们确定是否有任何好处之前,我们需要知道发送者和接收者真正做了什么。对于任何好处,发送者线程和接收者线程必须具有可以同时 ....而不是连续执行的工作。如果目的是不让程序等待发送和接收事务,那么这根本不会这样做。