Articles of multithreading

尝试创build线程时malloc中的错误

大家好,我只发布代码的核心创build问题和哪些线程的工作。 #define HR_OFF h_r-1 pthread_t *threads = NULL; int h_r = 1; int foo(int handler) { // if everything is empty alloc resources if (threads == NULL) { threads = (pthread_t*)malloc(sizeof(pthread_t)); // stuff with other variables h_r++; } else { // stuff with other variables threads = (pthread_t*)realloc(threads, sizeof(pthread_t) * h_r); h_r++; } // stuff […]

在unix(solaris / linux)中查找进程的线程使用资源(CPU和内存)

我有一个multithreading应用程序(C ++和pthread库),我想知道每个线程使用多less资源(CPU和内存)。 有没有办法在Solaris和Linux上或两者上find这些细节。

在dup赛后安全吗?

在Linux上,pwrite操作(seek + write)是primefaces操作,这意味着在一个文件描述符的多个线程中执行pwrite-s是安全的。 我想创build文件描述符复制,使用dup()。 现在有了fd1和fd2,pwrite-s会如预期那样工作,还是会有竞争状态的危险?

读一个variables混淆了它?

我们有以下代码行: printf("%d\n", toc->runlist.next); printf("%d\n", toc->runlist.next); 这些是定义: typedef struct thread_overview_control{ int id[NR_UTHREADS]; list_t runlist; int active_counter; int main_thread; int need_resched; } thread_overview_control; thread_overview_control* toc; 我想要做的是实现用户线程。 出于某种原因,上面的代码在我们的testing运行崩溃时的输出是: 12345678 //some address 0 //NOW IT'S NULL?!?!?! 这怎么发生? 我们所做的只是读取一个variables。 而奇怪的是,没有printf的,就没有崩溃。 这是怎么回事?

在C下实现multithreading应用程序

我正在实施一个像MySQL这样的小型数据库。它是大型项目的一部分。 现在我已经devise了核心数据库,我的意思是我已经实现了一个parsing器,我现在可以在我的数据库上执行一些基本的SQL查询..它可以存储,更新,删除和检索文件中的数据..截至目前罚款..但是我想在networking上实现这一点.. 我希望不止一个用户能够访问我的数据库服务器并同时对其执行查询…我正在Linux下工作,所以现在没有可移植性的问题.. 我知道我需要使用套接字是好的..我也知道我需要使用像线程池这样的概念,我将需要创build最大线程数,然后为每个客户端请求唤醒一个线程和分配它给客户.. 至于现在我无法弄清楚是如何将所有这些实际上捆绑在一起..我应该在哪里实现multithreading..在客户端/服务器端。 我的parsing器将如何被configuration为分别从每个客户端获取input?(主要是通过我认为的文件?) 如果任何人有想法如何我可以实施这个请告诉我bcos我卡在这里的项目… 谢谢.. :)

为什么这个代码不是确定性的?

下面的代码片段是来自SPLASH 2的 water-nsq基准testing代码。 if (comp_last > NMOL1) { for (mol = StartMol[ProcID]; mol < NMOL; mol++) { pthread_mutex_lock(&gl->MolLock[mol % MAXLCKS]); for ( dir = XDIR; dir <= ZDIR; dir++) { temp_p = VAR[mol].F[DEST][dir]; temp_p[H1] += PFORCES[ProcID][mol][dir][H1]; temp_p[O] += PFORCES[ProcID][mol][dir][O]; temp_p[H2] += PFORCES[ProcID][mol][dir][H2]; } pthread_mutex_unlock(&gl->MolLock[mol % MAXLCKS]); } comp = comp_last % NMOL; for (mol = […]

计算一个线程被抢占了多less次?

我正在尝试确定上下文切换对我的Java线程的影响。 因此,我必须首先知道“有多less次被抢占?” 其次,如果可能的话,“我的线程暂停执行多久了?”。 我非常怀疑这可以从Java完成,但嘿! 有趣的事情是做不可能的事,对吧? :)即使如果我必须重新编译VM或使用某种LINUX工具或黑客,我会很高兴。 所以,现在我们知道不能做到,我们来做吧。 🙂 编辑:加油的人。 另一个问题是优先相关的。 我想你只是喜欢简单而无聊的问题。 这个问题是清楚而有效的。

为什么读/写锁需要锁?

我得到了一个读/写锁的实现。 请注意,在函数的开始,有一个pthread_mutex_lock调用。 如果无论如何都使用pthread_mutex_lock ,那么使用读/写locking有什么好处。 如何比简单地使用pthread_mutex_lock更好? int pthread_rwlock_rlock_np(pthread_rwlock_t *rwlock) { pthread_mutex_lock(&(rwlock->mutex)); rwlock->r_waiting++; while (rwlock->r_wait > 0) { pthread_cond_wait(&(rwlock->r_ok), &(rwlock->mutex)); } rwlock->reading++; rwlock->r_waiting–; pthread_mutex_unlock(&(rwlock->mutex)); return 0; } int pthread_rwlock_wlock_np(pthread_rwlock_t *rwlock) { pthread_mutex_lock(&(rwlock->mutex)); if(pthread_mutex_trylock(&(rwlock->w_lock)) == 0) { rwlock->r_wait = 1; rwlock->w_waiting++; while (rwlock->reading > 0) { pthread_cond_wait(&(rwlock->w_ok), &(rwlock->mutex)); } rwlock->w_waiting–; pthread_mutex_unlock(&(rwlock->mutex)); return 0; } else { rwlock->wu_waiting++; while […]

线程开销性能

在C语言中使用线程进行编程时,在Linux shell中,我试图减less线程开销,基本上降低CPU时间(并使其更有效)。 现在在程序中,很multithreading正在创build,需要在终止之前做一个工作。 由于相互排斥,只有一个线程可以同时完成工作。 我知道一个线程在开始之前需要多长时间完成一项工作 其他线程不得不等待有一个线程做这个工作。 他们检查他们是否可以完成这项工作的方式是如果满足一个条件variables。 对于等待线程,如果他们等待使用该条件variables,使用这个特定的代码来等待(a,b,c和d只是任意的东西,这只是一个例子): while (a == b || c != d){ pthread_cond_wait(&open, &mylock); } 这有多高效? 什么发生在pthread_cond_wait代码? 是不是经常检查条件variables的一个while循环(在幕后)? 另外,因为我知道一个线程需要多长时间才能完成,所以我首先执行一个关于最短工作的调度策略会更有效率吗? 或者这并不重要,因为在任何线程的组合中,程序将花费相同的时间完成。 换句话说,是否使用最短的工作首先降低了其他线程的CPU开销呢? 由于最短的工作首先似乎减less了等待时间。

重用线程pthread

我有一个程序,不断得到一些工作要做(像一个服务器的东西),线程less。 从pthread库重用线程是正确的方法? 或者我不得不每次创build一个新的线程。 我想至less重用pthread_t结构。 我在想这样的事情: int main() { pthread_t threads[some value]; while (1) { get work; find a free thread; pthread_create(free thread, do work); pthread_join(done threads); } 但是我不知道如何正确地释放线程或者如何检查线程是否空闲。