Tag: multithreading

C线程编程 – 增加共享变量

嘿伙计……所以我试图刷新我的C线程,我发现的一个问题是: 给定全局变量int x = 0; 实现函数void useless(int n),它创建n个线程,在循环中将x增加1,每个线程在x达到100时终止。 我只是没有线程处理,需要一个坚实的例子来建立我的基础。 这必须尽可能使用pthread系统调用。

ISR和multithreading程序中的C’Volatile’关键字?

我读到了内存映射硬件寄存器,ISR和multithreading程序中C volatile关键字的用法。 1)注册 uint8_t volatile * pReg; while (*pReg == 0) { // do sth } // pReg point to status register 2)ISR int volatile flag = 0; int main() { while(!flag) { // do sth } } interrupt void rx_isr(void) { //change flag } 3)multithreading int volatile var = 0; int task1() { while […]

我可以使用pthreads为不同的线程调用nvme的ioctl()(系统调用)

我正在为nvme-cli开发一个测试工具(用c编写,可以在linux上运行)。 我有兴趣用’t’个线程重复一个nvme命令’r’次。 下面的代码重复执行命令和线程,但问题是并行执行时间与串行执行相比非常高。 根据我的观察,原因是从err = nvme_identify(fd, 0, 1, data);调用ioctl()系统调用err = nvme_identify(fd, 0, 1, data); 即nvme_identify()调用ioctl() 。 所以我可以知道ioctl()是否阻止了nvme? 我也可以通过线程减少执行时间(解决方案)吗? int repeat_cmd(int fd, void *data, int nsid,int cmd, int rc, int flags, struct repeatfields *rf, int threadcount) { pthread_t tid[threadcount]; int err, i=0,j=0; struct my_struct1 my_struct[threadcount]; switch(cmd){ case 1 : for (j=0; j <threadcount; j++) { my_struct[j].fd […]

在系统调用内核时是否可以抢占线程?

我正在运行2个线程(假设它们暂时是pthreads)。 Thread_1()进行用户定义的API调用,最终在内核中完成一些工作。 Thread_2()完全在用户空间中。 我的问题是:在API调用正在进行时,Thread_2()可以通过抢占Thread_1()来开始执行,控件是在内核中的某个地方吗? 如果不是,为什么,如果我希望这种情况发生(出于任何原因),我该怎么办?

strtok函数和multithreading

我读了很多关于strtok(char * s1,char * s2)及其实现的内容。 但是,我仍然无法理解在multithreading程序中使用它是一个危险的function。 有人可以给我一个multithreading程序的例子并解释那里的问题吗? 请注意,我正在寻找一个示例,告诉我问题出在哪里。 ps:strtok(char * s1,char * s2)是C标准库的一部分。

sqlite内存中的数据库和multithreading

我的应用程序使用sqlite作为后端创建一个内存数据库(:memory :)。 我希望我的主线程创建到内存数据库的连接,并且此连接由多个线程共享。 这可能吗? SQLite 3.7.8现在可供下载。 共享缓存是否可行?

在pthreads中唤醒单个线程而不是忙等待

我不确定这个标题是否反映了我在这里所要求的内容,但是如果没有一个非常强大的标题我就能做到最好。 我正在尝试在pthreads实现一个worker thread模型。 我想从main函数中生成一组线程,然后main线程将作业委托给worker并等待所有线程完成,然后再将它们分配给下一个作业(实际上,要求是将线程排列在一个块中像CUDA编程模型,但在CPU上。虽然它与当前的问题无关)。 job数组用于指示每个线程的作业类型。 目前,我已经使用信号量实现了这一点,这使得繁忙的等待。 我正在寻找方法来使线程进入睡眠状态,只有在需要时才会唤醒,而不是连续轮询。 每个线程执行的function volatile int jobs[MAX_THREADS]; // global job indicator array sem_t semaphore; // semaphore to indicate completion thread_execute(void *args) { tid = get_id(args); while(jobs[tid] != -1) { if(jobs[tid] == 0) continue; // no job if(jobs[tid] == JOBS_1) { jobs1(); jobs[tid] = 0; // go back to idle state sem_post(&semapahore); […]

Python,Threads,GIL和C ++

是否有一些方法可以使boost :: python控制Python GIL与python的每次交互? 我正在用boost :: python编写一个项目。 我正在尝试为外部库编写C ++包装器,并使用python脚本控制C ++库。 我无法更改外部库,只能更改我的包装器程序。 (我正在为所述外部库编写function测试应用程序) 外部库是用C语言编写的,并使用函数指针和回调来进行大量繁重工作。 它是一个消息传递系统,所以当一条消息进来时,就会调用一个回调函数。 我在我的库中实现了一个观察者模式,以便多个对象可以监听一个回调。 我把所有主要的球员都妥善地输出了,我可以很好地控制到某一点。 外部库创建线程来处理消息,发送消息,处理等。其中一些回调可能是从不同的进程调用的,我最近发现python不是线程安全的。 这些观察者可以在python中定义,所以我需要能够调用python和python需要在任何时候调用我的程序。 我像这样设置对象和观察者 class TestObserver( MyLib.ConnectionObserver ): def receivedMsg( self, msg ): print(“Received a message!”) ob = TestObserver() cnx = MyLib.Conection() cnx.attachObserver( ob ) 然后我创建一个发送到连接的源,并调用receivedMsg函数。 所以常规的source.send(’msg’)将进入我的C ++应用程序,转到C库,它将发送消息,连接将获取它,然后调用回调,然后返回到我的C ++库和连接尝试通知所有观察者,此时此处是python类,因此它调用该方法。 当然,回调是从连接线程调用的,而不是主应用程序线程。 昨天一切都崩溃了,我无法发送1条消息。 然后在Cplusplus-sig档案中挖掘后,我了解了GIL和一些非常好的function来锁定事物。 所以我的观察者类的C ++ python包装器现在看起来像这样 struct IConnectionObserver_wrapper : Observers::IConnectionObserver, wrapper […]

作为OpenMP pragma的结果的中间代码

有没有办法获得OpenMP pragma生成的中间源代码? 我想看看每种pragma是如何翻译的。 干杯。

嵌套循环,内循环并行化,重用线程

免责声明:以下示例只是一个快速了解问题的虚拟示例。 如果您正在考虑现实问题,请考虑任何动态编程。 问题:我们有一个n * m矩阵,我们想要复制上一行中的元素,如下面的代码所示: for (i = 1; i < n; i++) for (j = 0; j < m; j++) x[i][j] = x[i-1][j]; 方法:必须按顺序执行外循环迭代,它们将按顺序执行。 内环可以并行化。 我们希望最小化创建和杀死线程的开销,因此我们只想创建一次线程团队,但是,这似乎是OpenMP中不可能完成的任务。 #pragma omp parallel private(j) { for (i = 1; i < n; i++) { #pragma omp for scheduled(dynamic) for (j = 0; j < m; j++) x[i][j] = […]