Tag: multithreading

Monte Carlo pi逼近的并行化

我正在编写ac脚本来与OpenMp并行化pi近似。 我认为我的代码在令人信服的输出下运行良好。 我现在用4个线程运行它。 我不确定的是,如果此代码容易受到竞争条件的影响? 如果是,如何协调此代码中的线程操作? 代码如下: #include #include #include #include #include double sample_interval(double a, double b) { double x = ((double) rand())/((double) RAND_MAX); return (ba)*x + a; } int main (int argc, char **argv) { int N = atoi( argv[1] ); // convert command-line input to N = number of points int i; int NumThreads […]

读写器访问多个读者

我在UNIX中实现WRITER-READER问题时遇到了一些问题。 首先是我不知道,我怎么能修改代码才能像线程一样调用进入阅览室。 例如,当作家在阅览室时,读者正在等待进入阅览室。 当作家逃离阅览室,读者进入阅览室时,他仍在等待机会。 第二个是我不知道如何修改代码以允许一些读者进入阅览室。 在我的代码中,只有一个线程可以在阅览室中同时进行。 第三个是,如何识别作家或读者是否在挨饿? 哪一个在我的代码中挨饿? 这是代码: #include #include #include #define READERS 15 #define WRITERS 10 int bufferw = 0, bufferr = 0, counterw = WRITERS, counterr = READERS; int i; pthread_mutex_t mwrite, mread; pthread_cond_t condw, condr; pthread_t r[READERS], w[WRITERS]; void *writer(void *ptr) { pthread_mutex_lock(&mwrite); { counterr = READERS; counterw = WRITERS; ++bufferw; […]

RPC无法解码TCP传输的参数

我正在研究基于此页面示例的multithreadingRPC服务器: http : //bderzhavets.blogspot.ca/2005/11/multithreaded-rpc-server-in-white-box.html 不幸的是,它没有完全开箱即用,在追逐错误一段时间之后,我发现服务器无法解码参数(基于squareproc_2的返回码)。 在函数serv_request调用squareproc_2_svc之后,服务器端的执行似乎停止了。 请参阅case: SQUAREPROC中的代码中的SQUAREPROC void *serv_request(void *data) { struct thr_data *ptr_data = (struct thr_data *)data; { square_in argument; square_out result; bool_t retval; xdrproc_t _xdr_argument, _xdr_result; bool_t (*local)(char *, void *, struct svc_req *); struct svc_req *rqstp = ptr_data->rqstp; register SVCXPRT *transp = ptr_data->transp; switch (rqstp->rq_proc) { case NULLPROC: printf(“NULLPROC called\n”); (void) […]

multithreading嵌入式软件中的primefaces操作

我一直在用C开发基于RTOS的嵌入式软件,我遇到了几个线程共享资源访问的问题。 我有两个问题。 第一个是在状态机中设置和获取状态变量的值。 下面是StateMachine“object”的头文件: typedef enum{ STATE_01, STATE_02, STATE_03, STATE_04 }state_e; // state machine instance typedef struct{ state_e currState; }StateMachine; extern state_e GetState(StateMachine*); extern void SetState(StateMachine*, state_e); 访问方法的实现如下: state_e GetState(StateMachine *sm){ return sm->currState; } void SetState(StateMachine *sm, state_e state){ sm->currState = state; } 我的问题是我不确定是否应该使用互斥锁来控制对状态变量的访问。 我的意思是在32位MCU上读取和写入32位变量是primefaces操作。 第二个问题涉及读取包含无符号32位整数的数组的一个项的值,其中每个位存储一位变量的值。 在这里,我不确定是否有必要使用互斥锁。 出于与上述相同的原因,我认为没有,但我想听一些更有经验的程序员的意见。 位数组“对象”的关联头文件: typedef struct{ uint32_t BitsArray[NO_WORDS]; }BitsArray; extern […]

multithreadingC程序中的线程ID错误?

我是C语言中的multithreading新手,我有这个问题。 我写了以下代码: #include #include #include pthread_mutex_t m=PTHREAD_MUTEX_INITIALIZER; pthread_attr_t attr; void* test(void *a) { int i=*((int *)a); printf(“The thread %d has started.\n”,i); pthread_mutex_lock(&m); sleep(1); printf(“The thread %d has finished.\n”,i); pthread_mutex_unlock(&m); pthread_exit(NULL); } int main() { int i=0; pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_JOINABLE); pthread_t thread[5]; for (i=0;i<5;i++) pthread_create(&thread[i],&attr,test,&i); for (i=0;i<5;i++) pthread_join(thread[i],NULL); return 0; } 为什么我会得到如下值: The thread 0 has started. The […]

具有数据依赖性的for循环矢量化

我有基于BiCCG(共轭梯度)的矩阵求解器的实现,它也考虑了周期性。 碰巧的情况是,实现是计算密集型的,并且由于依赖性问题,循环不会自动向量化。 我进行了一些探索,似乎红黑高斯seidel算法比vanilla版本(也有类似的依赖性问题)更有效并行化。 可以更改此循环/算法,以便可以有效地进行矢量化吗? // FORWARD #pragma omp for schedule(static, nx/NTt) for (i=1; i<=nx; i++) for (j=1; j<=ny; j++) for (k=1; k<=nz; k++) { dummy = res_sparse_s[i][j][k]; dummy -= COEFF[i][j][k][7] * RLL[i-1][j][k]; if (PeriodicBoundaryX && i==nx)dummy -= COEFF[i][j][k][8] * RLL[1 ][j][k]; dummy -= COEFF[i][j][k][2] * RLL[i][j-1][k]; if (PeriodicBoundaryY && j==ny) dummy -= COEFF[i][j][k][3] * RLL[i][1 […]

为什么线程同步不需要volatile关键字?

我读到volatile关键字不适合线程同步,事实上根本不需要它。 虽然我知道使用这个关键字是不够的,但我不明白为什么它完全没必要。 例如,假设我们有两个线程,线程A仅从共享变量读取,线程B仅写入共享变量。 通过例如pthreads互斥锁实现适当的同步。 IIUC,没有volatile关键字,编译器可能会查看线程A的代码并说:“这里的变量似乎没有被修改,但是我们有很多读取; 让我们只读一次,缓存值并优化掉所有后续读取。“它也可以查看线程B的代码并说:”我们在这里有很多写这个变量但没有读取; 因此,不需要写入值,因此我们可以优化所有写入。“ 两种优化都是不正确的。 和 都 挥发性会阻止一个人。 因此,我可能会得出结论,虽然volatile不足以同步线程,但仍然需要在线程之间共享任何变量。 (注意:我现在读到,实际上不需要volatile来防止写入错误;所以我没有想法如何防止这种不正确的优化) 我明白我错在这里。 但为什么?

在Windows中创建线程时不兼容的类型

我创建了一个应用程序,其中我想要一个线程分别处理listen-UDP并使我成为一个缓冲区,但是当我尝试将它传递给线程时,它表示存在兼容性问题 hThread = CreateThread( NULL, // default security attributes 0, // use default stack size start, // thread function name &buffer, // argument to thread function 0, // use default creation flags &dwThreadId); 我的开始function是 void start(buffer_t *buffer) { SOCKET s; struct sockaddr_in server, si_other; int slen , recv_len; char buf[BUFLEN]; WSADATA wsa; } 而错误是 1 […]

Linux / POSIX等效于Win32的CreateEvent,SetEvent,WaitForSingleObject

我写了一个小类来同步Linux(实际上是Android)和Windows的线程。 这是我的界面的Win32实现: class SyncObjectWin32 : public SyncObject { private: const HANDLE m_hEvent; public: SyncObjectWin32() : m_hEvent( ::CreateEvent( NULL, FALSE, FALSE ) ) { if( NULL == m_hEvent ) throw core::Exception( “sys::SyncObjectWin32::SyncObjectWin32() – Failed to create event.” ); } ~SyncObjectWin32() { ::CloseHandle( m_hEvent ); } void WaitForSignal() { ::WaitForSingleObject( m_hEvent ); } void Signal() { ::SetEvent( […]

如何等待线程完成他们的工作,在c中克隆创建的线程?

我试着等待主要function,直到线程完成他们的工作。 但主要function完成其工作并退出。 我认为因为线程在变量中没有正确的指针/值。(理货和步骤) 在这种情况下,有人知道如何正确使用waitpid / wait吗? 我的代码: #define _GNU_SOURCE #include #include /* for PRIu64 and uint64_t */ /* you’ll need further includes */ #include #include #include “tally.h” #include #include #include #define STACK_SIZE 32768 #define THREADS 2 struct clone_args{ uint64_t steps; uint64_t* tally; }; int incHelper(void* arg){ struct clone_args *args = (struct clone_args*)arg; uint64_t steps= args->steps; […]