Tag: multithreading

在C中实现KeyPress事件

我有一个像下面这样的无限循环,在这个循环中,我想连续检查键盘,看看是否按下了退出键(ESC)。 如果按下,则应该打破循环。 我怎么能用C做到这一点? (我正在使用gcc,并且在必须通过线程完成的情况下也可以访问pthread) while(1){ //do something //check for the ESC key }

如何保证64位写入是primefaces的?

什么时候可以保证64位写入是primefaces的,在基于Intel x86的平台上用C编程时(特别是使用英特尔编译器运行MacOSX 10.4的基于Intel的Mac)? 例如: unsigned long long int y; y = 0xfedcba87654321ULL; /* … a bunch of other time-consuming stuff happens… */ y = 0x12345678abcdefULL; 如果另一个线程在y的第一次赋值完成后检查y的值,我想确保它看到值0xfedcba87654321或值0x12345678abcdef,而不是它们的某些混合。 我想这样做没有任何锁定,如果可能的话没有任何额外的代码。 我希望,当在支持64位代码(MacOSX 10.4)的操作系统上使用64位编译器(64位Intel编译器)时,这些64位写入将是primefaces的。 这总是如此吗?

C中的任何单用户单生产者无锁队列实现?

我正在编写一个带有消费者线程和生产者线程的程序,现在看来队列同步在程序中是一个很大的开销,我找了一些无锁队列实现,但只发现了Lamport的版本和PPoPP的改进版本’ 08: enqueue_nonblock(data) { if (NULL != buffer[head]) { return EWOULDBLOCK; } buffer[head] = data; head = NEXT(head); return 0; } dequeue_nonblock(data) { data = buffer[tail]; if (NULL == data) { return EWOULDBLOCK; } buffer[tail] = NULL; tail = NEXT(tail); return 0; } 两个版本都需要为数据预先分配的数组,我的问题是,是否存在使用malloc()动态分配空间的任何单用户单生产者无锁队列实现? 另一个相关问题是,如何测量队列同步中的确切开销? 比如pthread_mutex_lock()需要多长时间等。

Pthread – time.h :: sleep()和pthread.h :: pthread_yield()之间有什么区别?

我花了很长时间寻找有关time.h :: sleep()和pthread.h :: pthread_yield()之间差异的信息,但无法找到任何可靠的参考资料,所以我发布了这个问题。 time.h :: sleep()和pthread.h :: pthread_yield()有什么区别? 更新: 我问的原因是因为我使用sleep()来睡眠()每个单独的线程……当我有8个线程和4个线程时,我的应用程序开始出现问题。 当我上线查看sleep()是否只影响每个线程时,我找不到任何好的引用来说明Sleep()是否影响整个进程,或者sleep()只影响单个线程。

易变量

哪个是存储在程序存储器中的易失性变量(在哪个部分)?

多个线程写在同一个文件上

我想知道我们是否可以使用多个线程在同一个文件上写二进制数据。 FILE *fd = openfile(“test”); int SIZE = 1000000000; int * table = malloc(sizeof(int) * SIZE); // .. filling the table fwrite(table, sizeof(*table), SIZE, fd); 所以我想知道我是否可以使用线程,并且每个线程调用fssek来寻找不同的位置来写入同一个文件。 任何的想法 ?

根据CERT编码规则POS49-C访问共享结构中的相邻成员时的竞争条件?

根据CERT编码规则POS49-C ,访问相同结构的不同字段的不同线程可能会发生冲突。 我使用常规的unsigned int而不是bit-field。 struct multi_threaded_flags { unsigned int flag1; unsigned int flag2; }; struct multi_threaded_flags flags; void thread1(void) { flags.flag1 = 1; } void thread2(void) { flags.flag2 = 2; } 我可以看到,即使是unsigned int,仍然存在竞争条件IF编译器决定使用加载/存储8个字节而不是4个字节。 我认为编译器永远不会这样做,并且竞争条件永远不会发生在这里,但这完全是我的猜测。 是否有关于此案例的明确定义的汇编/编译器文档? 我希望锁定,这是昂贵的,是这种情况恰好未定义的最后手段。 仅供参考,我使用gcc。

使用OpenMP和OpenSSL时内存泄漏和seg故障

我有一个庞大的代码(我的学校项目),我使用Openssl 。 一切都工作完美,工具我决定我会multithreading。 我选择openmp作为我的线程环境,因为它非常简单易学(至少我需要的基础很简单)。 我的整个代码看起来像这样: struct mystr[10]; omp_set_num_threads(10); #pragma omp parallel { mystr[omp_get_thread_num()] = call_fun_which_uses_openssl(); } CRYPTO_cleanup_all_ex_data(); 我的call_fun_which_uses_openssl函数使用低级openssls api函数( MD4((unsigned char*)&string, strlen(string), (unsigned char*)&digest);而不是MD4_CTX ctx等)。 我的函数使用RSA,DSA,…并且无法访问任何全局变量,它使用的每个变量都在call_fun_which_uses_openssl声明,所以像我这样做multithreading应该保证这些变量保持私有。 虽然,我有时会在此代码中出现seg错误。 我读到CRYPTO_cleanup_all_ex_data不是线程安全的(但我需要它因为内存泄漏)但是我在并行区域外使用它,对吧? 当我删除openmp调用时,每次都有效,所以multithreading和openssl一定存在问题。 任何想法如何解决? 在我看来它应该工作,因为call_fun_which_uses_openssl的线程调用为每个线程创建自己的私有变量,应该没有问题…请,帮助:)

睡觉一段确切的时间

我对睡眠function的理解是它遵循“至少语义”,即睡眠(5)将保证线程hibernate5秒,但是根据其他因素,它可能会保持阻塞超过5秒。 有没有办法在指定的时间段内睡觉(没有忙碌的等待)。

什么是multithreading等待的`pthread_mutex_lock()`唤醒命令?

假设我在调用pthread_mutex_lock()有多个线程阻塞。 当互斥锁变得可用时,调用pthread_mutex_lock()的第一个线程是否获得锁定? 也就是说,是按FIFO顺序调用pthread_mutex_lock() ? 如果不是,那么它们的订单是什么? 谢谢!