【发布时间】:2012-07-07 17:57:50
【问题描述】:
我想知道为什么以天真的方式实现这种队列是不正确的:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <sys/time.h>
void *print_message_function( void *ptr );
void *reader( void *ptr );
void *writer( void *ptr );
int queue[500000];
int main(int argc, char **argv)
{
pthread_t thread1, thread2;
char *message1 = "Thread 1";
char *message2 = "Thread 2";
int iret1, iret2;
iret1 = pthread_create( &thread1, NULL, writer, (void*) message1);
iret2 = pthread_create( &thread2, NULL, reader, (void*) message2);
usleep(2000);
void pthread_exit(void *iret1 );
void pthread_exit(void *iret2 );
exit(0);
}
void *writer( void *ptr )
{
// make local copy of queue head
register int *pos = queue;
// struct thread_param *tp = arg;
int counter = 0;
while(1)
{
//Write to head of queue
*pos = 5;
pos++;
print_message_function( ptr);
}
}
void *reader( void *ptr )
{
int counter = 0;
// make local copy of queue head
register int *pos = queue;
while(1)
{
// Read from tail of queue - loop when nothing
if ( *pos == 5 )
{
print_message_function( ptr );
pos++;
}
}
}
void *print_message_function( void *ptr )
{
char *message;
message = (char *) ptr;
printf("%s \n", message);
}
我确实打算缓存对齐队列。
我不认为内存重新排序是一个问题,因为队列头的副本是在开始时制作的,并且只有一个读取器和写入器。
我想要这个的原因是它应该比互斥锁或 CAS 操作更快。
【问题讨论】:
-
这是为了成为可移植的 C 代码还是特定于平台?如果是这样,它应该在什么平台上运行?
-
独立于平台的linux,如果需要我可以编写自定义程序集。
-
这有点矛盾。它是特定于 Linux 的吗?还是与平台无关?
-
对不起.. 它的平台特定的。
-
通过常规阻塞队列让您的系统工作到功能级别。如果您有性能问题,您可能会发现您必须查看一些不同的队列类。你只会排队指针,是吗?当队列仅在 push/pop 一个指针时间被锁定时,您必须非常努力地获得争用。总体而言,正如其他人所警告的那样,您的应用程序性能可能会被 CPU 循环所破坏。同样,CPU 亲和性也很重要。把时间花在“真正的”应用代码上不是更好吗?
标签: c multithreading pthreads queue lock-free